.net IEqualityComparer.Equals与IEnumerable一起使用时。包含列表中的x或y值吗?

.net IEqualityComparer.Equals与IEnumerable一起使用时。包含列表中的x或y值吗?,.net,ienumerable,iequalitycomparer,.net,Ienumerable,Iequalitycomparer,IEnumberable有一个包含两个参数的扩展方法。第一个参数是要检查的值,第二个是IEqualityComparer的实现。 查看IEqualityComparer.Equals,它需要两个名为x和y的参数来比较第一个和第二个对象 我的问题是X或Y是IEnumerable的值 范例 List test=newlist这不重要-等式应该是对称的。从以下文件: Equals方法是自反的, 对称的,可传递的。就是 如果用于比较数据,则返回true 对象本身;两个人都是这样 对象x和y(如果y为真)

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

我的问题是X或Y是IEnumerable的值

范例


List test=newlist这不重要-等式应该是对称的。从以下文件:

Equals方法是自反的, 对称的,可传递的。就是 如果用于比较数据,则返回true 对象本身;两个人都是这样 对象x和y(如果y为真) 和x;对于两个对象x和 z,如果x和y为真,并且 y和z为真


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

为了完整起见,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;
}
公共静态bool包含(此IEnumerable源、TSource值、IEqualityComparer比较器)
{
if(比较器==null)
{
comparer=EqualityComparer.Default;
}
if(source==null)
{
抛出错误。ArgumentNull(“源”);
}
foreach(源中的TSource本地)
{
if(比较器等于(本地值))
{
返回true;
}
}
返回false;
}

我仍然觉得有趣的是,IComparer不需要是可传递的。。。事实上,这不是字符串
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;
}