Правильно, поэтому у меня есть перечисляемый и желаю получить от него отличные значения.
Используя System.Linq
, конечно, существует метод расширения, называемый Distinct
. В простом случае его можно использовать без параметров, например:
var distinctValues = myStringList.Distinct();
Ну и хорошо, но если у меня есть перечисляемые объекты, для которых мне нужно указать равенство, единственная доступная перегрузка:
var distinctValues = myCustomerList.Distinct(someEqualityComparer);
Аргумент сопоставления равенства должен быть экземпляром IEqualityComparer<T>
. Я могу это сделать, конечно, но это несколько многословно и, ну, cludgy.
То, что я ожидал бы, это перегрузка, которая будет принимать лямбда, скажем, Func < T, T, bool > :
var distinctValues
= myCustomerList.Distinct((c1, c2) => c1.CustomerId == c2.CustomerId);
Кто-нибудь знает, существует ли такое расширение, или какое-то эквивалентное обходное решение? Или я что-то упускаю?
В качестве альтернативы, есть способ указать IEqualityComparer встроенный (embarass me)?
Обновление
Я нашел ответ Андерса Хейлсберга на сообщение на форуме MSDN по этому вопросу. Он говорит:
Проблема, с которой вы столкнетесь, заключается в том, что при сравнении двух объектов они должны иметь одинаковое возвращаемое значение GetHashCode (или хэш-таблица, используемая внутренне с помощью Distinct, будет работать неправильно). Мы используем IEqualityComparer, потому что он совместим с пакетами реализации Equals и GetHashCode в один интерфейс.
Я полагаю, что это имеет смысл.