2

IEnumberable 有一个扩展方法 Contains<T>,它接受两个参数。第一个参数是要检查的值,第二个参数是 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")?

4

2 回答 2

3

没关系 - 平等应该是对称的。从文档中IEqualityComparer<T>.Equals

Equals 方法是自反的、对称的和传递的。也就是说,如果用于将对象与自身进行比较,则返回true;如果对 y 和 x 为真,则对两个对象 x 和 y 为真;如果对 x 和 y 为真并且对 y 和 z 也为真,则对两个对象 x 和 z 为真。

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

于 2009-04-15T10:34:08.240 回答
1

为了完整起见,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;
}
于 2009-04-20T08:12:15.917 回答