Richtig, ich habe also eine Aufzählung und möchte verschiedene Werte daraus erhalten.
Verwendung von System.Linq
gibt es natürlich eine Erweiterungsmethode namens Distinct
. Im einfachen Fall kann es ohne Parameter verwendet werden, wie:
var distinctValues = myStringList.Distinct();
Schön und gut, aber wenn ich eine Aufzählung von Objekten habe, für die ich Gleichheit angeben muss, ist die einzige verfügbare Überladung:
var distinctValues = myCustomerList.Distinct(someEqualityComparer);
Das Argument des Gleichheitsvergleichers muss eine Instanz von IEqualityComparer<T>
. Das kann ich natürlich auch tun, aber es ist etwas langatmig und, nun ja, unübersichtlich.
Was ich erwartet hätte, ist eine Überladung, die ein Lambda, sagen wir ein Func<T, T, bool>
:
var distinctValues = myCustomerList.Distinct((c1, c2) => c1.CustomerId == c2.CustomerId);
Weiß jemand, ob es eine solche Erweiterung oder eine gleichwertige Umgehung gibt? Oder übersehe ich etwas?
Gibt es alternativ dazu eine Möglichkeit, eine IEqualityComparer
inline (mich blamieren)?
Update
Ich habe eine Antwort von Anders Hejlsberg auf eine Beitrag in einem MSDN-Forum zu diesem Thema. Er sagt:
Das Problem, auf das Sie stoßen werden, ist, dass beim Vergleich zweier Objekte gleich sind, müssen sie denselben GetHashCode-Rückgabewert haben (oder die Hash-Tabelle, die intern von Distinct verwendet wird, nicht korrekt funktionieren). Wir verwenden IEqualityComparer, weil es kompatible Implementierungen von Equals und GetHashCode in einer einzigen Schnittstelle zusammenfasst.
Ich denke, das macht Sinn.
2 Stimmen
Siehe stackoverflow.com/questions/1183403/ für eine Lösung mit GroupBy
0 Stimmen
Nein, das ergibt keinen Sinn - wie können zwei Objekte, die identische Werte enthalten, zwei verschiedene Hash-Codes zurückgeben?
1 Stimmen
Es könnte helfen - Lösung para
.Distinct(new KeyEqualityComparer<Customer,string>(c1 => c1.CustomerId))
und erklären, warum GetHashCode() wichtig ist, damit es richtig funktioniert.1 Stimmen
Verwandt / mögliches Duplikat von: LINQ's Distinct() für eine bestimmte Eigenschaft
0 Stimmen
@G.Y Es ist sinnvoll, weil Gleichheit nicht absolut ist. Man könnte z.B. "Hallo" und "hallo" in einem bestimmten Kontext als gleich betrachten, und das ist der Sinn der Möglichkeit, einen eigenen Gleichheitsvergleicher zu erstellen: eine Definition von Gleichheit zu liefern, die auf den Bereich/Kontext zugeschnitten ist, in dem man sich befindet.
3 Stimmen
Jetzt können Sie die eingebaute DistinctBy-Methode von .Net 6 wie folgt verwenden DistinctBy(x => x.CustomerId) .