Richtig, ich habe also eine Aufzählung und möchte unterschiedliche Werte daraus ziehen.
Mit System.Linq
gibt es natürlich eine Erweiterungsmethode namens Distinct
. Im einfachen Fall kann es ohne Parameter verwendet werden, wie zum Beispiel:
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 Gleichheitsvergleichsargument muss eine Instanz von sein IEqualityComparer<T>
. Ich kann das natürlich, aber es ist etwas ausführlich und ungeschickt.
Was ich erwartet hätte, ist eine Überlastung, die ein Lambda benötigt, sagen wir eine Func <T, T, bool>:
var distinctValues
= myCustomerList.Distinct((c1, c2) => c1.CustomerId == c2.CustomerId);
Weiß jemand, ob es eine solche Erweiterung oder eine gleichwertige Problemumgehung gibt? Oder fehlt mir etwas?
Gibt es alternativ eine Möglichkeit, einen IEqualityComparer inline anzugeben (peinlich für mich)?
Aktualisieren
Ich habe eine Antwort von Anders Hejlsberg auf einen Beitrag in einem MSDN-Forum zu diesem Thema gefunden. Er sagt:
Das Problem, auf das Sie stoßen werden, ist, dass zwei Objekte, wenn sie gleich sind, denselben GetHashCode-Rückgabewert haben müssen (andernfalls funktioniert die von Distinct intern verwendete Hash-Tabelle nicht richtig). Wir verwenden IEqualityComparer, weil es kompatible Implementierungen von Equals und GetHashCode in einer einzigen Schnittstelle verpackt.
Ich nehme an, das macht Sinn ..