LINQ GroupBy анонимный тип - PullRequest
3 голосов
/ 20 марта 2012

Мне интересно, почему GroupBy работает с анонимными типами.

List<string> values = new List<string>();
values.GroupBy(s => new { Length = s.Length, Value = s })

Анонимные типы не реализуют никаких интерфейсов, поэтому я запутался, как это работает.

Я предполагаю, что алгоритм работает, создавая экземпляр анонимного типа для каждого элемента в источнике и используя хеширование для группировки элементов вместе.Тем не менее, IEqualityComparer не предоставляется, чтобы определить, как генерировать хэш или равны ли два экземпляра.Я бы тогда предположил, что методы Object.Equals и Object.GetHashCode были бы запасным вариантом, основанным на идентичности объекта.

Итак, как же это работает, как и ожидалось?И все же это не работает в OrderBy.Анонимные типы переопределяют Equals и GetHashCode?или основной алгоритм GroupBy творит магию, о которой я даже не думал?

Ответы [ 3 ]

3 голосов
/ 20 марта 2012

Согласно документации, анонимный тип является ссылочным типом :

С точки зрения общеязыковой среды выполнения анонимный тип ничем не отличается от любого другого ссылочного типа.

Следовательно, он будет использовать реализацию по умолчанию для тех функций, которые реализованы System.Object (что, по крайней мере, для равенство основано на ссылочном равенстве ).

РЕДАКТИРОВАТЬ : На самом деле, согласно той же первой ссылке на документ, он говорит:

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

0 голосов
/ 20 марта 2012

Это не работает на OrderBy, потому что новый объект не реализует IComparable.

0 голосов
/ 20 марта 2012

http://msdn.microsoft.com/en-us/library/bb397696.aspx

Эта ссылка объясняет, что GetHashCode и Equals переопределяются .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...