РЕДАКТИРОВАТЬ : теперь это часть MoreLINQ .
То, что вам нужно, это «четко различимый». Я не верю, что это часть LINQ в ее нынешнем виде, хотя ее довольно легко написать:
public static IEnumerable<TSource> DistinctBy<TSource, TKey>
(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
{
HashSet<TKey> seenKeys = new HashSet<TKey>();
foreach (TSource element in source)
{
if (seenKeys.Add(keySelector(element)))
{
yield return element;
}
}
}
Таким образом, чтобы найти отличительные значения, используя только свойство Id
, вы можете использовать:
var query = people.DistinctBy(p => p.Id);
А для использования нескольких свойств вы можете использовать анонимные типы, которые соответствующим образом реализуют равенство:
var query = people.DistinctBy(p => new { p.Id, p.Name });
Не проверено, но оно должно работать (и теперь, по крайней мере, компилируется).
Предполагается, что для ключей используется компаратор по умолчанию - если вы хотите передать компаратор равенства, просто передайте его конструктору HashSet
.