LINQ to Objects Group由多个属性比较器组成

时间:2013-11-12 01:16:39

标签: c# .net linq group-by linq-to-objects

在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();

2 个答案:

答案 0 :(得分:2)

关于任意类型的MSDN documentation

  

因为匿名类型上的Equals和GetHashCode方法是根据属性的Equals和GetHashcode方法定义的,所以同一匿名类型的两个实例只有在它们的所有属性相等时才相等。

将创建匿名类型,并根据属性实施Equals()GetHashCode()。如果属性相同,这两个方法将返回相同的结果。我想在后面有一些集合可以保存匿名类型的不同实例。

答案 1 :(得分:1)

当编译器生成匿名类型时,它还会生成Equals()GetHashCode()方法以按值进行比较。你可以在反编译器中看到这一点。

默认EqualityComparer对匿名类型一无所知;它只是调用这些方法。