LINQ to Objects Group по множеству свойств сравнения

В Linq to Object (перечислимые)

Как компаратор по умолчанию разрешает следующее?

//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 ответа

Решение

Следуя документации MSDN по анонимным типам

Поскольку методы Equals и GetHashCode для анонимных типов определены в терминах методов Equals и GetHashcode свойств, два экземпляра одного и того же анонимного типа равны, только если все их свойства равны.

Анонимный тип будет создан и имеет Equals() а также GetHashCode() реализация на основе свойств. Если свойства будут одинаковыми, эти два метода вернут одинаковый результат. Я предполагаю, что есть некоторая коллекция сзади, которая содержит различные экземпляры анонимного типа.

Когда компилятор генерирует анонимный тип, он также генерирует Equals() а также GetHashCode() методы, чтобы сравнить это по значению. Вы можете увидеть это в декомпиляторе.

По умолчанию EqualityComparer ничего не знает об анонимных типах; он просто вызывает эти методы.

Другие вопросы по тегам