Innlegg
Samlingssamenlikneren, Finne Forskjellene Mellom To Samlinger
22. juli 2019 • 2 min lesing

Har du måttet sammenligne to samlinger og utføre noe logikk basert på om elementet er i kildesamlingen, i sammenligningssamlingen eller i begge? Ja, det har jeg også, jeg trengte å slå sammen data fra UI og databasen. Jeg kunne ikke finne en god løsning, så jeg skrev en samlingssamenlikner.
For å illustrere hvordan dette fungerer, la oss se på et eksempel.
I kildedataene har vi verdiene 1, 3, 4, 6, og i
sammenligningssamlingen har vi verdiene 1, 2, 3, 4, 5.
Kildedataene mangler 2 og 5 når de sammenlignes med sammenligningssamlingen, og sammenligningssamlingen mangler 6 når den sammenlignes med kildesamlingen.
La oss gå gjennom denne sammenslåingen:
- i begge (oppdater)
- bare i sammenligningssamlingen (legg til i kilde)
- i begge (oppdater)
- i begge (oppdater)
- bare i sammenligningssamlingen (legg til i kilde)
- bare i kildesamlingen (fjern fra kilde)
Her er hvordan koden ser ut:
var source = new []{1, 3, 4, 6};
var collection = new[] {1, 2, 3, 4, 5};
source.CompareTo(collection, (s, d) => s == d)
.OnlyInSourceCollection(s=> {/* gjør noe */})
.OnlyInComparingCollection(s=>{/* gjør noe */})
.InBoth(s=> {/*gjør noe*/})
.Process();
Hvorfor ikke bruke LINQ?
Du kan bruke LINQ, men LINQ vil iterere samlingene minst 3 ganger, noe som ikke inkluderer operasjoner (legge til, oppdatere og slette) på dataene. Ved å bruke CollectionComparer
, blir dataene bare iterert to ganger.
Det finnes raskere måter å finne forskjellene på, som binærsøk, men binærsøk fungerer bare med heltall. Samlingssamenlikneren støtter alle typer sammenligninger. Sammenligningen er definert med denne koden: (s, d) => s == d
.
Kildekoden finnes på GitHub.
Forfatter: Chuck Conway spesialiserer seg på programvareutvikling og Generativ AI. Koble til ham på sosiale medier: X (@chuckconway) eller besøk ham på YouTube.