【问题标题】:IEqualityComparer.Equals when used with IEnumerable.Contains is x or y the value in the list?IEqualityComparer.Equals 与 IEnumerable.Contains 一起使用时,x 或 y 是列表中的值吗?
【发布时间】:2009-04-15 10:30:18
【问题描述】:

IEnumberable 有一个扩展方法 Contains,它接受两个参数。第一个参数是要检查的值,第二个参数是 IEqualityComparer 的实现。 查看 IEqualityComparer.Equals 它需要两个名为 x 和 y 的参数,用于比较第一个和第二个对象。

我的问题是 IEnumerable 的值是 X 还是 Y?

例子

List<string> test = new List<String() { "a", "b", "c" };
test.Contains("d", myComparer);

当它为第一个值调用 Equals 方法时 Equals("a","d") 还是 Equals("d","a")?

【问题讨论】:

    标签: .net ienumerable iequalitycomparer


    【解决方案1】:

    没关系 - 平等应该是对称的。来自IEqualityComparer&lt;T&gt;.Equals 的文档:

    Equals 方法是自反的, 对称的和传递的。这就对了 如果用于比较 对象与自身;对两个人来说是真的 如果 y 为真,则对象 x 和 y 和 x;并且对于两个对象 x 和 true z 如果 x 和 y 为真,并且也 y 和 z 为真。

    我不相信Enumerable.Contains 中的用法是明确定义的,即它可能会在未来的版本中发生变化。如果你只是让你的相等比较器遵守接口文档,你会没事的。

    【讨论】:

    • 我仍然觉得 IComparer不需要必须是可传递的......而且确实不适合字符串
    【解决方案2】:

    为了完整起见,IEnumberable 的反射代码显示它位于左侧(见下文)。然而,这并不能保证永远不会改变,所以使用它是有风险的。

    public static bool Contains<TSource>(this IEnumerable<TSource> source, TSource value, IEqualityComparer<TSource> comparer)
    {
        if (comparer == null)
        {
            comparer = EqualityComparer<TSource>.Default;
        }
        if (source == null)
        {
            throw Error.ArgumentNull("source");
        }
        foreach (TSource local in source)
        {
            if (comparer.Equals(local, value))
            {
                return true;
            }
        }
        return false;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-20
      • 1970-01-01
      • 2016-05-06
      相关资源
      最近更新 更多