.net - EqualityComparer<Uri>.Default.Equals() 返回错误结果还是什么?

标签 .net .net-3.5 equals iequalitycomparer

最佳答案

好吧,问题(无论对错)不在 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版本是否相同,转义的非特殊字符是否应该转义等等。乌里的 Compare在这种情况下,方法可能是有益的。

关于.net - EqualityComparer<Uri>.Default.Equals() 返回错误结果还是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8468930/

相关文章:

c# - 将 XML 文档转换为流利的 C#

java - 如果满足要求,则语句似乎会跳过

java - 如何在 java 中正确覆盖继承的 equals?

c# - 如何防止列表中的项目在未填写且应为 "0"时返回 "null"?

c# - 如何显示具有多个子级WPF DataGrid的记录?

.net - 将 Dotfuscator 作为构建后事件运行

java - equals/Arrays.deepequals 在相同数组上返回 false

c# - 如果 BIGENDIAN 在编译时未解析,为什么它是一个指令?

vb.net - 如何在 RichTextBox 中隐藏插入符号?

c# - 使用 NLog 和运行时参数记录到数据库