Ich habe 2 Listenobjekte:
%Vor%Sagen wir, sie haben Werte:
%Vor%Ich muss ein Objekt bekommen, das die "distinct" Liste von diesen beiden enthält; In diesem Fall wäre die Rückgabe also die Liste {2, 3}.
Gibt es einen einfachen Weg, dies zu tun? Oder muss ich jeden Wert der Listen durchlaufen und vergleichen?
Ich bin offen für die Verwendung von ObjectQuery, LINQ usw., da diese Listen aus einer Datenbank kommen und möglicherweise mehrere hundert bis mehrere tausend Einträge lang sein können.
Danke!
Ahmad hat fast Recht mit Except
, glaube ich - aber das gibt dir keine Gegenstände, die in lst2
sind, aber nicht in lst1
. Wenn Sie in dem Beispiel, das Sie angegeben haben, 5 zu lst2
hinzugefügt haben, stelle ich mir vor, Sie möchten, dass das Ergebnis {2, 3, 5} lautet. In diesem Fall möchten Sie eine symmetrische Differenz. Ich glaube nicht, dass es eine Möglichkeit gibt, dies direkt in LINQ zu Objects in einem einzigen Aufruf zu tun, aber Sie können es dennoch erreichen. Hier ist eine einfache, aber ineffiziente Art und Weise, es zu tun:
(Sie brauchen natürlich nur ToList()
, wenn Sie wirklich eine List<T>
anstelle von IEnumerable<T>
benötigen.)
Der Weg, dies zu lesen, ist "Ich möchte Elemente, die in einer der Listen sind, aber nicht in beiden."
Es ist möglich, dass Concat
effizienter ist - was immer noch funktionieren würde, da Except
ein mengenbasierter Operator ist, der nur eindeutige Ergebnisse liefert:
BEARBEITEN: Dank der Kommentare, die Sie benötigen, um etwas mehr zu tun, als nur Except
zu verwenden, um einen symmetrischen Unterschied zu erhalten. Wenn der zweiten Liste ein zusätzlicher Wert hinzugefügt wird, wäre nur die Angabe inkorrekt. Um das richtige Ergebnis zu erhalten, versuchen Sie Folgendes:
Das obige gibt {2, 3, 6} zurück.
Beachten Sie, dass Sie ToList()
hinzufügen müssen, wenn Sie wirklich eine List<int>
benötigen, andernfalls gibt die obige Operation IEnumerable<int>
zurück.
Verwenden Sie die Methode "Enumerable.Except" , die den Satzunterschied zweier Sequenzen erzeugt:
%Vor%Wenn die Ergebnisse aus der Datenbank kommen, wäre es besser, sie dort zu verarbeiten. Es wird viel schneller sein als im Speicherbetrieb, besonders wenn es viele Ergebnisse gibt.
Wenn Sie sie in Ihrem Code verarbeiten müssen, können Sie i4o - Indexed LINQ verwenden, um es schneller zu machen.
LINQ wäre der einfache Weg, jedes Element basierend auf seinem Wert zu gruppieren und dann nur diejenigen auszuwählen, die ein Element haben:
%Vor%Wenn Sie hier überspringen verwenden, können Sie sicherstellen, dass nicht mehr als ein Element existiert. Wenn in der Sequenz 1 oder weniger Elemente vorhanden sind, wird eine leere Sequenz zurückgegeben, für die Any den Wert false zurückgibt.