簡體   English   中英

EqualityComparer <Uri> .Default.Equals()返回錯誤的結果還是什么?

[英]EqualityComparer<Uri>.Default.Equals() returning wrong result or what?

除了作為.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=2rHTS9LaN4249gTOh_GrDw&sa=X&oi=book_result&ct=result&resnum=3&ved=0CA0Q6AEwAg#v=onepage&q=弗萊徹

http://books.google.com/books?id=B84KAQAAIAAJ&pg=PA29&lpg=PA29&dq=fletcher+sandford+tilton&source=bl&ots=ou8eF5REOG&sig=74fzA11Z8AENBtyCUcXEsXV06jQ&hl=en&ei=2rHTS9LaN4249gTOh_GrDw&sa=X&oi=book_result&ct=result&resnum=3&ved=0CA0Q6AEwAg#v=onepage&q=弗萊徹

注意第一個空格后面的空格后跟's'。

好吧,關注(無論是對還是錯)不在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方法可能是有益的。

您看到的行為是按設計進行的。 Uri片段在其Equals實現中被忽略,因為它們在技術上不是URI本身的一部分。 UriFragment部分是“#v = onepage&q = fletcher”(#符號及其后的所有內容)。

您可以使用UriCompare方法並指定要包含在比較中的UriComponents

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM