我为自定义类实现了一个比较类,以便可以在两个列表(Intersect
和StudentList1
)上使用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/