Intersect 未使用 EqualComparer 提供任何结果

本文关键字:任何 结果 未使用 EqualComparer Intersect | 更新日期: 2023-09-27 18:33:41

我误解了如何实现EqualComparer和Intersect。我想了解使用 c# 和 linq 的集合,但下面的代码没有产生任何结果。这是我的代码

using System;
using System.Collections.Generic;
using System.Linq;
class Program
{

public class objTest : EqualityComparer<objTest>
{
    public int index { get; set; }
    public string name { get; set; }
    public override  bool Equals(objTest x, objTest y)
    {
        return x.index == y.index;
    }
    public override int GetHashCode(objTest obj)
    {
        return obj.index.GetHashCode();
    }

}
 static void Main(string[] args)
{
    List<objTest> L1 = new List<objTest>();
    L1.Add(new objTest { index = 1, name = "ALAN" });
    L1.Add(new objTest { index = 2, name = "bill" });
    L1.Add(new objTest { index = 3, name = "clive" });
    L1.Add(new objTest { index = 4, name = "dave" });
    L1.Add(new objTest { index = 5, name = "ewan" });
    List<objTest> L2 = new List<objTest>();
    L2.Add(new objTest { index = 11, name = "ALAN" });
    L2.Add(new objTest { index = 12, name = "bill" });
    L2.Add(new objTest { index = 13, name = "clive" });
    L2.Add(new objTest { index = 14, name = "dave" });
    L2.Add(new objTest { index = 1, name = "ALAN2" });
    //THIS HAS NO RESULTS
    var L3 = L1.Intersect(L2);
}
}

有人可以告诉我为什么 L3 没有结果吗?

Intersect 未使用 EqualComparer 提供任何结果

您需要

引用在Intersect中实现IEqualityComparer的类的实例。这样:

        public class objTest 
        {
            public int index { get; set; }
            public string name { get; set; }
        }
        class eqcomp : EqualityComparer<objTest>
        {
            public override bool Equals(objTest x, objTest y)
            {
                return x.index == y.index;
            }
            public override int GetHashCode(objTest obj)
            {
                return obj.index.GetHashCode();
            }

        }
        static void Main(string[] args)
        {
            List<objTest> L1 = new List<objTest>();
            L1.Add(new objTest { index = 1, name = "ALAN" });
            L1.Add(new objTest { index = 2, name = "bill" });
            L1.Add(new objTest { index = 3, name = "clive" });
            L1.Add(new objTest { index = 4, name = "dave" });
            L1.Add(new objTest { index = 5, name = "ewan" });
            List<objTest> L2 = new List<objTest>();
            L2.Add(new objTest { index = 11, name = "ALAN" });
            L2.Add(new objTest { index = 12, name = "bill" });
            L2.Add(new objTest { index = 13, name = "clive" });
            L2.Add(new objTest { index = 14, name = "dave" });
            L2.Add(new objTest { index = 1, name = "ALAN2" });
            //THIS HAS RESULTS :)
            var L3 = L1.Intersect(L2, new eqcomp());
     }
}

如果你想使用外部比较,mrtig已经回答了。

如果您希望objTest实例相互比较:您正在覆盖错误的EqualsGetHashCode.您应该覆盖采用一个参数并将其与this进行比较的Equals。您不应该实施EqualityComparer

using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
    public class objTest
    {
        public int index { get; set; }
        public string name { get; set; }
        public override bool Equals(object other)
        {
            objTest o = other as objTest;
            return o != null && o.index == index;
        }
        public override int GetHashCode()
        {
            return index.GetHashCode();
        }
    }
    static void Main(string[] args)
    {
        List<objTest> L1 = new List<objTest>();
        L1.Add(new objTest { index = 1, name = "ALAN" });
        L1.Add(new objTest { index = 2, name = "bill" });
        L1.Add(new objTest { index = 3, name = "clive" });
        L1.Add(new objTest { index = 4, name = "dave" });
        L1.Add(new objTest { index = 5, name = "ewan" });
        List<objTest> L2 = new List<objTest>();
        L2.Add(new objTest { index = 11, name = "ALAN" });
        L2.Add(new objTest { index = 12, name = "bill" });
        L2.Add(new objTest { index = 13, name = "clive" });
        L2.Add(new objTest { index = 14, name = "dave" });
        L2.Add(new objTest { index = 1, name = "ALAN2" });
        //THIS HAS NO RESULTS
        var L3 = L1.Intersect(L2);
    }
}

你应该实现IEquatable<objTest>而不是IEqualityComparer<objTest>Intersect的 MSDN 文档具有误导性,因为它指示您实现后者,即使示例实现了前者。

请注意,在这种情况下,您还应该覆盖Object.EqualsObject.GetHashCode。像这样:

public bool Equals(objTest other)
{
    return this.index == other.index;
}
public override bool Equals(object other)
{
    var o = other as objTest;
    return o != null && Equals(o);
}
public override int GetHashCode()
{
    return index.GetHashCode();
}