LINQ相交不返回项目

时间:2015-01-31 19:00:37

标签: c# linq

我为自定义类实现了一个比较类,以便我可以在两个列表(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();

2 个答案:

答案 0 :(得分:3)

问题出在您的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方法的原因。

答案 1 :(得分:1)

您正在基础对象上调用GetHashCode(),这将为不同的引用返回不同的值。我会像这样实现它:

    public override int GetHashCode(Student obj)
    {
        unchecked
        {
            return obj.StudentName.GetHashCode() + obj.Age.GetHashCode();
        }
    }