Heim >Backend-Entwicklung >C++ >Wie kann ich mit .Except() und IEqualityComparer effizient den Unterschied zwischen zwei Listen in C# finden?

Wie kann ich mit .Except() und IEqualityComparer effizient den Unterschied zwischen zwei Listen in C# finden?

Susan Sarandon
Susan SarandonOriginal
2025-01-23 00:58:10283Durchsuche

How Can I Efficiently Find the Difference Between Two Lists in C# Using .Except() and IEqualityComparer?

Vergleichen und Identifizieren von Unterschieden zwischen C#-Listen

Die effiziente Bestimmung der Unterschiede zwischen zwei Listen ist eine häufige Aufgabe in der C#-Programmierung. Die .Except()-Methode bietet eine leistungsstarke Lösung, ihre Anwendung kann jedoch nuanciert werden, insbesondere bei der Arbeit mit benutzerdefinierten Objekten.

Verwendung von .Except() mit Referenztypgleichheit

Für benutzerdefinierte Objekte (z. B. CustomObjects), die die Methoden Equals() und GetHashCode() korrekt überschreiben, ist die Verwendung von .Except() unkompliziert:

<code class="language-csharp">var list3 = list1.Except(list2).ToList();</code>

Dadurch wird list3 erstellt, das Elemente aus list1 enthält, die nicht in list2 enthalten sind.

Benutzerdefinierter Gleichheitsvergleich mit IEqualityComparer

Komplexere Gleichheitsprüfungen, wie z. B. Vergleiche basierend auf einer bestimmten Eigenschaft (wie Id), erfordern die Implementierung der IEqualityComparer<T>-Schnittstelle. Hier ist ein Beispiel:

<code class="language-csharp">public class IdComparer : IEqualityComparer<CustomObject>
{
    public int GetHashCode(CustomObject co) => co.Id.GetHashCode();
    public bool Equals(CustomObject x1, CustomObject x2) => x1.Id == x2.Id;
}</code>

Dann verwenden Sie diesen Vergleicher mit .Except():

<code class="language-csharp">var list3 = list1.Except(list2, new IdComparer()).ToList();</code>

Umgang mit doppelten Elementen

Der Standard .Except() entfernt Duplikate. Um sie zu bewahren, verwenden Sie diese Alternative:

<code class="language-csharp">var set2 = new HashSet<CustomObject>(list2);
var list3 = list1.Where(x => !set2.Contains(x)).ToList();</code>

Dadurch wird ein HashSet für eine effiziente Mitgliedschaftsprüfung genutzt, was dazu führt, dass list3 Duplikate beibehalten werden. Beachten Sie, dass die Reihenfolge der Elemente in list3 vom Original list1 abweichen kann.

Das obige ist der detaillierte Inhalt vonWie kann ich mit .Except() und IEqualityComparer effizient den Unterschied zwischen zwei Listen in C# finden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn