在Linq to Object(Enumerables)中
默认比较器如何解决以下问题?
//The following is essentially a select distinct
var x = from student in class
group student by new {student.MajorId, student.GradeId} into performanceStudentGroup
select new { performanceStudentGroup.Key.MajorId, performanceStudentGroup.Key.GradeId};
显然,为了使上述工作正常,框架必须比较2个匿名类型,以检查它们是否属于同一组。
它是如何做到的?如何检查除引用指针之外的其他内容?
该比较器与以下代码有何不同之处:
var y = (from student in class
select new { student.MajorId, student.GradeId}).Distinct();
答案 0 :(得分:2)
关于任意类型的MSDN documentation
因为匿名类型上的Equals和GetHashCode方法是根据属性的Equals和GetHashcode方法定义的,所以同一匿名类型的两个实例只有在它们的所有属性相等时才相等。
将创建匿名类型,并根据属性实施Equals()
和GetHashCode()
。如果属性相同,这两个方法将返回相同的结果。我想在后面有一些集合可以保存匿名类型的不同实例。
答案 1 :(得分:1)
当编译器生成匿名类型时,它还会生成Equals()
和GetHashCode()
方法以按值进行比较。你可以在反编译器中看到这一点。
默认EqualityComparer
对匿名类型一无所知;它只是调用这些方法。