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=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”后面的空格。

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片段在其Equals实现中被忽略,因为它们在技术上不是 URI 本身的一部分。您的Fragment部分Uri是“#v=onepage&q=fletcher”(# 符号及其后面的所有内容)。

您可以使用Uri'sCompare方法并指定UriComponents要包含在比较中的内容。

于 2011-12-12T01:27:11.073 回答