Equals和GetHashCode
Equals每一个实现都必须遵循如下约定:ide
GetHashCode:性能
IEqualityComparer实现
下面咱们建立一个学生类,从而进一步的实现咱们对象数据的对比flex
public class Student { public string Name { get; set; } public int Age { get; set; } }
经过以下代码咱们将经过distinct方法实现咱们的过滤.code
class Program { static void Main(string[] args) { List<Student> students = new List<Student> { new Student{ Name = "MR.A", Age = 32}, new Student{ Name = "MR.B", Age = 34}, new Student{ Name = "MR.A", Age = 32} }; Console.WriteLine("distinctStudents has Count = {0}", students.Distinct().Count());//distinctStudents has Count = 3 Console.ReadLine(); } }
咱们须要达到的是忽略相同数据的对象,可是并无达到咱们如期的效果.由于是distinct默认比较的是对象的引用...因此这样达不到咱们预期效果.那咱们修改一下来实现咱们预期效果.对象
在默认状况下Equals具备如下行为:get
Distinct
经过使用指定的 IEqualityComparer
TSource source 的元素类型。it
comparer IEqualityComparer
咱们来看以下代码片断
public class StudentComparator : EqualityComparer<Student> { public override bool Equals(Student x,Student y) { return x.Name == y.Name && x.Age == y.Age; } public override int GetHashCode(Student obj) { return obj.Name.GetHashCode() * obj.Age; } }
上述代码片断若是两个Equals返回的true而且GetHashCode返回相同的哈希码,则认为两个对象相等.
重写Equals和GetHashCode
var stu1 = new Student { Name = "MR.A", Age = 32 }; var stu2 = new Student { Name = "MR.A", Age = 32 }; bool result = stu1.Equals(stu2); //false because it's reference Equals
上述代码片断执行后结果非预期效果.咱们将进一步的去实现代码,以达到预期效果....
public class Student { public string Name { get; set; } public int Age { get; set; } public override bool Equals(object obj) { var stu = obj as Student; if (stu == null) return false; return Name == stu.Name && Age == stu.Age; } public override int GetHashCode() { return Name.GetHashCode() * Age; } } var stu1 = new Student { Name = "MR.A", Age = 32 }; var stu2 = new Student { Name = "MR.A", Age = 32 }; bool result = stu1.Equals(stu2); //result is true
咱们再使用LINQ Distinct方法进行过滤和查询,同时将会检查Equals和GetHashCode
List<Student> students = new List<Student> { new Student{ Name = "MR.A", Age = 32}, new Student{ Name = "MR.B", Age = 34}, new Student{ Name = "MR.A", Age = 32} }; Console.WriteLine("distinctStudents has Count = {0}", students.Distinct().Count()); //distinctStudents has Count = 2