EqualityComparer <uri> .Default.Equals()返回错误的结果或什么?</uri>

时间:2011-12-12 01:17:19

标签: .net .net-3.5 equals iequalitycomparer

2 个答案:

答案 0 :(得分: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方法可能是有益的。

答案 1 :(得分:1)

您看到的行为是按设计进行的。在Equals实现中忽略Uri个片段,因为它们在技术上不是URI本身的一部分。 Uri的{​​{3}}部分是“#v = onepage&amp; q = fletcher”(#符号及其后的所有内容)。

您可以使用Uri的{​​{3}}方法,并指定要在比较中包含哪个Fragment