4

.NET Frameworkのバグである以外に、これについての説明はありますか?メソッドは、次のEqualityComparer<Uri>.Default.Equals()URLが等しいと言っています!

http://books.google.com/books?id=B84KAQAAIAAJ&pg=PA29&lpg=PA29&dq=fletcher+sandford+tilton&source=bl&ots=ou8eF5REOG&sig=74fzA11Z8AENBtyCUcXEsXV06jQ&hl=en&ei=2rHTS9LaN4 fletchers _

http://books.google.com/books?id=B84KAQAAIAAJ&pg=PA29&lpg=PA29&dq=fletcher+sandford+tilton&source=bl&ots=ou8eF5REOG&sig=74fzA11Z8AENBtyCUcXEsXV06jQ&hl=en&ei=2rHTS9LaN4フレッチャー

最初のスペースの最後に「s」が続くスペースに注意してください。

4

2 に答える 2

2

まあ、(正しいか間違っているかにかかわらず)懸念はありませんEqualityComparer<Uri>.Default。必要に応じて呼び出しますUri.Equals()

ここで、Uri.Equals()フラグメントのみの違いを無視します。多くの場合、それは適切です。非常に多くの場合、そうではありません。個人的にはそれをデフォルトとして持っていなかったでしょうが、それから私はそれをコーディングした人ではないので、おそらく私は物事をそのままにするいくつかの説得力のある理由を知りません。

これは文書化されていることに注意してください。

他の決定も議論の余地があります(ホストコンポーネントの大文字と小文字の違いはURIに関する多くの実際的な懸念と一致しますが、一部の仕様でURIの同等性がどのように定義されているかは無視されます)。

それよりも厳密な等式が必要な場合は、独自のコンパレータを定義することをお勧めします。

public class UriStictEqualityComparer : IEqualityComparer<Uri>
{
  public bool Equals(Uri x, Uri y)
  {
    return ReferenceEquals(x, y)
      ||
      (
        x != null
        &&
        y != null
        &&
        x.IsAbsoluteUri == y.IsAbsoluteUri
        &&
        x.ToString() == y.ToString()
      );
  }
  public int GetHashCode(Uri obj)
  {
    return obj == null ? 0 : obj.ToString().GetHashCode();
  }
}

それでも、上記で等しくないと見なされる場合もある場合もあります。たとえば、punycodeと非punycodeのバージョンが同じであるかどうか、エスケープされた非特殊文字をエスケープ解除する必要があるかどうかなどを考慮する必要があります。このような場合、 UriのCompare方法が役立ちます。

于 2011-12-12T01:40:39.043 に答える
1

表示されている動作は仕様によるものです。フラグメントは、技術的にはURI自体の一部ではないためUri、実装では無視されます。EqualsあなたのFragment一部Uriは「#v = onepage&q = fletcher」(#記号とそれに続くすべて)です。

Uri'sメソッドを使用して、比較に含めるCompareメソッドを指定できます。UriComponents

于 2011-12-12T01:27:11.073 に答える