Czy starasz się odróżnić więcej niż jedno pole? Jeśli tak, po prostu użyj typu anonimowego i operatora Distinct i powinno być dobrze:
var query = doc.Elements("whatever")
.Select(element => new {
id = (int) element.Attribute("id"),
category = (int) element.Attribute("cat") })
.Distinct();
Jeśli próbujesz uzyskać odrębny zestaw wartości „większego” typu, ale patrząc tylko na pewien podzbiór właściwości dla aspektu odrębności, prawdopodobnie chcesz, aby DistinctBy
zaimplementowano je w MoreLINQ w 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;
}
}
}
(Jeśli przekażesz null
jako element porównujący, użyje domyślnej funkcji porównującej dla typu klucza).
Po prostu użyj
Distinct()
z własną porównywarką.http://msdn.microsoft.com/en-us/library/bb338049.aspx
źródło
Oprócz odpowiedzi Jona Skeeta możesz również użyć grupy według wyrażeń, aby uzyskać unikalne grupy wraz z liczbą dla każdej iteracji grup:
źródło
Dla każdego, kto wciąż szuka; oto inny sposób implementacji niestandardowej funkcji porównującej lambda.
możesz następnie utworzyć rozszerzenie linq Distinct, które może przyjmować lambdy
Stosowanie:
źródło
Trochę spóźniłem się z odpowiedzią, ale możesz to zrobić, jeśli chcesz mieć cały element, a nie tylko wartości, według których chcesz pogrupować:
To da ci pierwszy cały element pasujący do twojej grupy przez zaznaczenie, podobnie jak drugi przykład Jona Skeetsa używającego DistinctBy, ale bez implementowania funkcji porównującej IEqualityComparer. DistinctBy najprawdopodobniej będzie szybsze, ale powyższe rozwiązanie będzie wymagało mniej kodu, jeśli wydajność nie jest problemem.
źródło
źródło
Ponieważ mówimy o posiadaniu każdego elementu dokładnie raz, „zestaw” ma dla mnie większy sens.
Przykład z zaimplementowanymi klasami i IEqualityComparer:
Teraz
setList
będą miały unikalne elementyMyślałem o tym, mając do czynienia z tym,
.Except()
który zwraca różnicę zestawuźródło