public class Student { public int Age { get; set; } public string Name { get; set; } public string Adress { get; set; } }
List<Student> list = new List<Student>() { new Student(){Age=21,Name="Jack",Adress="Shenzhen"}, new Student(){Age=21,Name="Jack",Adress="GuangZhou"} }; var distinct = list.Distinct(new StudentComparer());
由于Distinct 直接获取对象的HashCode,用HashCode进行比较的速度比 Equals 方法更快,
因此IEqualityComparer内部会在使用 Equals 前先使用 GetHashCode 方法,在两个对象的HashCode都相同时即刻判断对象相等。
而当两个对象HashCode不相同时, Equals 方法就会被调用,对要比较的对象进行判断。
由于在上例中list中的两个引用实际上是两个不同的对象,因此HashCode必定不相同
所以要触发Equlas方法,我们需要改 GetHashCode ,让它返回相同的常量
public class StudentComparer : IEqualityComparer<Student> { public bool Equals(Man x, Man y) { return x.Age == y.Age && x.Name == y.Name; } public int GetHashCode(Man obj) { return 1; } }