2011-12-12 58 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