2011-12-12 18 views

回答

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和non-punycode版本是否相同,是否應該轉義非特殊字符,以此類推。在這種情況下,Uri的Compare方法可以是有益的。

+0

我喜歡自定義比較器的想法。但是如何比較字符串,因爲你建議比Uri.Compare(url,value,UriComponents.AbsoluteUri,UriFormat.Unescaped,StringComparison.CurrentCulture)更好。另外,爲什麼需要IsAbsoluteUri檢查? – HappyNomad

+0

直接char-by-char比較是一些規範(例如RDF)中使用的等同概念,使用ToString而不是AbsoluteUri可以防止部分URI的異常。當比較絕對和部分時,IsAbsoluteUri的差異會比字符串比較提供更快的答案(儘管不多)。 您建議的Uri.Compare可以在其他情況下做更好的工作,但它永遠不會看到親戚。還要注意,大多數URI的比較不具有文化意識,因此序數比較可能更接近您實際需要的比較。 –

+0

+1爲徹底,並標記爲答案 – HappyNomad

1

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

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

+0

根據RFC 3986,片段是URI的一部分。它們不被某些比較URI與對方的東西所考慮。 –

+0

@JonHanna:有趣的知道......謝謝! –

+0

好吧,那麼如何:Uri.Compare(url,value,UriComponents.AbsoluteUri,UriFormat.Unescaped,StringComparison.CurrentCulture) – HappyNomad