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