Skip to content

Beiträge

Der Collection Comparer, Unterschiede zwischen zwei Collections finden

22. Juli 2019 • 2 Min. Lesezeit

Der Collection Comparer, Unterschiede zwischen zwei Collections finden

Mussten Sie schon einmal zwei Collections vergleichen und basierend darauf Logik ausführen, ob das Element in der Quell-Collection, in der Vergleichs-Collection oder in beiden vorhanden ist? Ja, ich auch, ich musste Daten aus der UI und der Datenbank zusammenführen. Ich konnte keine gute Lösung finden, also schrieb ich einen Collection Comparer.

Um zu veranschaulichen, wie das funktioniert, schauen wir uns ein Beispiel an.

In den Quelldaten haben wir die Werte 1, 3, 4, 6, und in der
Vergleichs-Collection haben wir die Werte 1, 2, 3, 4, 5.

Den Quelldaten fehlen die 2 und die 5 im Vergleich zur Vergleichs-Collection, und der Vergleichs-Collection fehlt die 6 im Vergleich zur Quell-Collection.

Gehen wir durch diese Zusammenführung:

  1. in beiden (aktualisieren)
  2. nur in der Vergleichs-Collection (zur Quelle hinzufügen)
  3. in beiden (aktualisieren)
  4. in beiden (aktualisieren)
  5. nur in der Vergleichs-Collection (zur Quelle hinzufügen)
  6. nur in der Quell-Collection (aus der Quelle entfernen)

So sieht der Code aus:

var source = new []{1, 3, 4, 6};
var collection = new[] {1, 2, 3, 4, 5};

source.CompareTo(collection, (s, d) => s == d)
    .OnlyInSourceCollection(s=> {/* etwas tun */})
    .OnlyInComparingCollection(s=>{/* etwas tun */})
    .InBoth(s=> {/*etwas tun*/})
    .Process();

Warum nicht LINQ verwenden?

Sie können LINQ verwenden, jedoch wird LINQ die Collections mindestens 3 Mal durchlaufen, was das Operieren (Hinzufügen, Aktualisieren und Löschen) auf den Daten nicht einschließt. Mit dem CollectionComparer werden die Daten nur zweimal durchlaufen.

Es gibt schnellere Wege, die Unterschiede zu finden, wie zum Beispiel eine binäre Suche, aber eine binäre Suche funktioniert nur mit Ganzzahlen. Der Collection Comparer unterstützt jede Art von Vergleich. Der Vergleich wird mit diesem Code definiert: (s, d) => s == d.

Der Quellcode ist auf GitHub zu finden.

Autor: Chuck Conway ist spezialisiert auf Software-Engineering und Generative KI. Verbinden Sie sich mit ihm in den sozialen Medien: X (@chuckconway) oder besuchen Sie ihn auf YouTube.

↑ Zurück nach oben

Das könnte dir auch gefallen