Innlegg
Samlingens sammenligner, finne forskjellene mellom to samlinger
22. juli 2019 • 2 min lesing
Har du måttet sammenligne to samlinger og utføre logikk basert på om elementet er i kildesamlingen, i sammenligningssamlingen eller i begge? Ja, jeg også, jeg måtte slå sammen data fra brukergrensesnittet og databasen. Jeg kunne ikke finne en god løsning, så jeg skrev en samlingsammenligner.
For å illustrere hvordan dette fungerer, la oss se på et eksempel.
I kildedata har vi verdiene 1, 3, 4, 6, og i
sammenligningssamlingen har vi verdiene 1, 2, 3, 4, 5.
Kildedata mangler 2 og 5 når det sammenlignes med sammenligningssamlingen, og sammenligningssamlingen mangler 6 når det 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=> {/* do something */})
.OnlyInComparingCollection(s=>{/* do something */})
.InBoth(s=> {/*do something*/})
.Process();
Hvorfor ikke bruke LINQ?
Du kan bruke LINQ, men LINQ vil iterere gjennom 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å, for eksempel et binært søk, men et binært søk fungerer bare med heltall. Samlingsammenligningen støtter enhver type sammenligning. Sammenligningen er definert med denne koden: (s, d) => s == d.
Kildekoden finnes på GitHub.
Forfatter: Chuck Conway er en AI-ingeniør med nesten 30 års erfaring innen programvareutvikling. Han bygger praktiske AI-systemer—innholdspipelines, infrastrukturagenter og verktøy som løser virkelige problemer—og deler det han lærer underveis. Koble til ham på sosiale medier: X (@chuckconway) eller besøk ham på YouTube og på SubStack.