0

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

2 回答 2

2

遵循关于 Anyonymous Types的MSDN 文档

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

匿名类型将被创建并具有基于属性的实现Equals()GetHashCode()如果属性相同,这两个方法将返回相同的结果。我想后面有一些集合,其中包含匿名类型的不同实例。

于 2013-11-12T01:22:36.990 回答
1

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

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

于 2013-11-12T01:22:30.573 回答