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