LINQs Distinct
mit Lambdas optimieren: Ein Wunschdenken?
LINQs Distinct
-Methode ist eine Grundvoraussetzung für die Arbeit mit Aufzählungen. Das Definieren benutzerdefinierter Gleichheitsvergleiche für verschiedene Vorgänge erfordert jedoch häufig die Verwendung von IEqualityComparer
, was zu ausführlich wirken kann. Eine Lambda-basierte Überladung wie dieses hypothetische Beispiel wäre deutlich prägnanter:
<code class="language-csharp">var distinctValues = myCustomerList.Distinct((c1, c2) => c1.CustomerId == c2.CustomerId);</code>
Praktische Alternativen zu Lambda-basierten Distinct
Während eine solche reine Lambda-Überladung im .NET Framework nicht existiert, erzielen mehrere Alternativen das gleiche Ergebnis:
1. Der GroupBy
- und Select
-Ansatz:
Dieser Ansatz verwendet GroupBy
, um Elemente basierend auf einem Schlüssel zu gruppieren (z. B. CustomerId
) und wählt dann das erste Element aus jeder Gruppe aus. Dadurch werden Duplikate effektiv herausgefiltert.
<code class="language-csharp">IEnumerable<Customer> distinctCustomers = originalList .GroupBy(customer => customer.CustomerId) .Select(group => group.First());</code>
2. Implementierung von IEqualityComparer<T>
:
Das Erstellen einer benutzerdefinierten Klasse, die IEqualityComparer<T>
implementiert, bietet eine robustere und typsicherere Lösung. Dies ermöglicht eine klar definierte Gleichheits- und Hashcode-Logik basierend auf Ihren spezifischen Kriterien. Dies ist im Allgemeinen die bevorzugte Methode für Wartbarkeit und Leistung.
3. (Davon wird dringend abgeraten) Reflexionsbasierter Vergleich:
Die Verwendung von Reflektion zum Vergleichen von Objekten anhand von Eigenschaften ist äußerst ineffizient und fehleranfällig. Vermeiden Sie diesen Ansatz, es sei denn, dies ist unbedingt erforderlich.
Der zugrunde liegende Grund für das Fehlen einer reinen Lambda-Überlastung:
Wie Anders Hejlsberg festgestellt hat, reicht ein Lambda allein für Distinct
Operationen nicht aus. Für ein konsistentes Verhalten müssen Objekte, die beim Vergleich als gleich angesehen werden, auch denselben Hash-Code erzeugen. IEqualityComparer
stellt diese Konsistenz sicher, indem es Implementierungen von Equals
und GetHashCode
erfordert.
Das obige ist der detaillierte Inhalt vonKönnen Lambda -Ausdrücke die unterschiedliche Methode von LINQ für benutzerdefinierte Gleichstellungsvergleiche vereinfachen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!