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
ничего не знает об анонимных типах; он просто вызывает эти методы.