Вы пытаетесь отличиться более чем одним полем? Если это так, просто используйте анонимный тип и оператор Distinct, и все должно быть в порядке:
var query = doc.Elements("whatever")
.Select(element => new {
id = (int) element.Attribute("id"),
category = (int) element.Attribute("cat") })
.Distinct();
Если вы пытаетесь получить отдельный набор значений «большего» типа, но смотрите только на некоторое подмножество свойств для аспекта отличимости, вы, вероятно, захотите DistinctBy
реализовать его в MoreLINQ в DistinctBy.cs
:
public static IEnumerable<TSource> DistinctBy<TSource, TKey>(
this IEnumerable<TSource> source,
Func<TSource, TKey> keySelector,
IEqualityComparer<TKey> comparer)
{
HashSet<TKey> knownKeys = new HashSet<TKey>(comparer);
foreach (TSource element in source)
{
if (knownKeys.Add(keySelector(element)))
{
yield return element;
}
}
}
(Если вы передадите в null
качестве компаратора, он будет использовать компаратор по умолчанию для типа ключа.)
Просто используйте
Distinct()
с вашим собственным компаратором.http://msdn.microsoft.com/en-us/library/bb338049.aspx
источник
В дополнение к ответу Джона Скита, вы также можете использовать выражения группы по группам, чтобы получить уникальные группы по количеству итераций для каждой группы:
источник
Для тех, кто еще ищет; Вот еще один способ реализации собственного лямбда-сравнения.
затем вы можете создать расширение для linq Distinct, которое может принимать лямбда-выражения
Использование:
источник
Я немного опаздываю с ответом, но вы можете сделать это, если вы хотите весь элемент, а не только значения, которые вы хотите сгруппировать по:
Это даст вам первый полный элемент, соответствующий вашей группе по выбору, во многом как второй пример Jon Skeets с использованием DistinctBy, но без реализации IEqualityComparer Comparer. DistinctBy, скорее всего, будет быстрее, но решение выше будет включать меньше кода, если производительность не является проблемой.
источник
источник
Поскольку мы говорим о наличии каждого элемента ровно один раз, «набор» имеет для меня больше смысла.
Пример с классами и реализованным IEqualityComparer:
Сейчас
setList
будет иметь уникальные элементыЯ думал об этом, имея дело с тем,
.Except()
что возвращает разность множествисточник