我为自定义类实现了一个比较类,以便可以在两个列表(IntersectStudentList1)上使用StudentList2。但是,当我运行以下代码时,没有任何结果。

学生:

class CompareStudent : IEqualityComparer<Student>
{
    public bool Equals(Student x, Student y)
    {
        if (x.Age == y.Age && x.StudentName.ToLower() == y.StudentName.ToLower())
            return true;
        return false;
    }

    public int GetHashCode(Student obj)
    {
        return obj.GetHashCode();
    }
}

class Student
{
    public int StudentId{set;get;}
    public string StudentName{set;get;}
    public int Age{get;set;}
    public int StandardId { get; set; }
}


主要:

IList<Student> StudentList1 = new List<Student>{
                new Student{StudentId=1,StudentName="faisal",Age=29,StandardId=1},
                new Student{StudentId=2,StudentName="qais",Age=19,StandardId=2},
                new Student{StudentId=3,StudentName="ali",Age=19}
            };
IList<Student> StudentList2 = new List<Student>{
                new Student{StudentId=1,StudentName="faisal",Age=29,StandardId=1},
                new Student{StudentId=2,StudentName="qais",Age=19,StandardId=2},

            };

var NewStdList = StudentList1.Intersect(StudentList2, new CompareStudent());

Console.ReadLine();

最佳答案

问题出在您的GetHashCode()方法内,将其更改为:

public int GetHashCode(Student obj)
{
    return obj.StudentId ^ obj.Age ^ obj.StandardId ^ obj.StudentName.Length;
}


在当前代码中,未调用Equals,因为当前GetHashCode()返回两个不同的整数,因此调用Equals毫无意义。

如果第一个对象的GetHashCode与第二个对象不同,则对象不相等,如果结果相同,则调用Equals

我上面写的GetHashCode不是最终的,有关如何实现GetHashCode的更多详细信息,请参见What is the best algorithm for an overridden System.Object.GetHashCode?

GetHashCode() is not(并且不能)没有冲突,这就是为什么首先需要Equals方法的原因。

关于c# - LINQ相交不返回项目,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28255352/

10-13 05:55