Versuchen Sie, sich durch mehr als ein Feld zu unterscheiden? Wenn ja, verwenden Sie einfach einen anonymen Typ und den Operator Distinct und es sollte in Ordnung sein:
var query = doc.Elements("whatever")
.Select(element => new {
id = (int) element.Attribute("id"),
category = (int) element.Attribute("cat") })
.Distinct();
Wenn Sie versuchen, eine bestimmte Menge von Werten eines "größeren" Typs zu erhalten, aber nur eine Teilmenge von Eigenschaften für den Unterscheidungsaspekt betrachten, möchten Sie wahrscheinlich, DistinctBy
wie in MoreLINQ implementiert in 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;
}
}
}
(Wenn Sie null
als Vergleicher übergeben, wird der Standardvergleicher für den Schlüsseltyp verwendet.)
Verwenden Sie das einfach
Distinct()
mit Ihrem eigenen Vergleicher.http://msdn.microsoft.com/en-us/library/bb338049.aspx
quelle
Zusätzlich zu Jon Skeets Antwort können Sie die Gruppe auch nach Ausdrücken verwenden, um die eindeutigen Gruppen mit einer Anzahl für jede Gruppeniteration zu ermitteln:
quelle
Für jeden, der noch sucht; Hier ist eine andere Möglichkeit, einen benutzerdefinierten Lambda-Vergleicher zu implementieren.
Sie können dann eine Erweiterung für den linq Distinct erstellen, die Lambdas aufnehmen kann
Verwendung:
quelle
Ich bin etwas spät bei der Antwort, aber Sie können dies tun, wenn Sie das gesamte Element und nicht nur die Werte, nach denen Sie gruppieren möchten, möchten:
Auf diese Weise erhalten Sie das erste vollständige Element, das Ihrer Gruppe nach Auswahl entspricht, ähnlich wie im zweiten Beispiel von Jon Skeets mit DistinctBy, jedoch ohne den IEqualityComparer-Vergleicher zu implementieren. DistinctBy wird höchstwahrscheinlich schneller sein, aber die obige Lösung wird weniger Code beinhalten, wenn die Leistung kein Problem darstellt.
quelle
quelle
Da es darum geht, jedes Element genau einmal zu haben, ist eine "Menge" für mich sinnvoller.
Beispiel mit implementierten Klassen und IEqualityComparer:
Jetzt
setList
wird einzigartige Elemente habenIch dachte daran, während ich mich damit befasste,
.Except()
was einen Satzunterschied ergibtquelle