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