Якщо ви не хочете додати бібліотеку MoreLinq до свого проекту лише для того, щоб отримати DistinctBy
функціональність, ви можете отримати той самий кінцевий результат, використовуючи перевантаження методу Linq, Distinct
який бере IEqualityComparer
аргумент.
Ви починаєте зі створення загального класу порівняння рівнів користувача, який використовує синтаксис лямбда для виконання спеціального порівняння двох екземплярів загального класу:
public class CustomEqualityComparer<T> : IEqualityComparer<T>
{
Func<T, T, bool> _comparison;
Func<T, int> _hashCodeFactory;
public CustomEqualityComparer(Func<T, T, bool> comparison, Func<T, int> hashCodeFactory)
{
_comparison = comparison;
_hashCodeFactory = hashCodeFactory;
}
public bool Equals(T x, T y)
{
return _comparison(x, y);
}
public int GetHashCode(T obj)
{
return _hashCodeFactory(obj);
}
}
Потім у своєму головному коді ви використовуєте його так:
Func<Person, Person, bool> areEqual = (p1, p2) => int.Equals(p1.Id, p2.Id);
Func<Person, int> getHashCode = (p) => p.Id.GetHashCode();
var query = people.Distinct(new CustomEqualityComparer<Person>(areEqual, getHashCode));
Вуаля! :)
Сказане передбачає наступне:
- Властивість
Person.Id
типуint
people
Колекція не містить будь - яких елементів невизначені
Якщо колекція може містити нулі, просто перепишіть лямбда, щоб перевірити наявність нуля, наприклад:
Func<Person, Person, bool> areEqual = (p1, p2) =>
{
return (p1 != null && p2 != null) ? int.Equals(p1.Id, p2.Id) : false;
};
EDIT
Цей підхід схожий на той, що відповідає у відповіді Володимира Нестеровського, але простіший.
Він також схожий на той, що відповідає у відповіді Джоеля, але дозволяє складною логікою порівняння, що включає декілька властивостей.
Однак якщо ваші об’єкти можуть колись відрізнятися, Id
то інший користувач дав правильну відповідь, що все, що вам потрібно зробити, це переосмислити реалізацію за замовчуванням GetHashCode()
та Equals()
у вашому Person
класі, а потім просто застосувати Distinct()
метод " out of the box" від Linq для фільтрації з будь-яких дублікатів.