Правильно, тому я маю безліч і бажаю отримати від цього чіткі цінності.
Використовуючи 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 в єдиний інтерфейс.
Я думаю, це має сенс ..