Der Versuch, unterschiedliche Werte von zwei Listint-Objekten zu erhalten

8

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!

    
SlackerCoder 01.04.2010, 15:12
quelle

6 Antworten

13

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:

%Vor%

(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:

%Vor%     
Jon Skeet 01.04.2010, 15:20
quelle
6

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:

%Vor%

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%     
Ahmad Mageed 01.04.2010 15:16
quelle
1

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.

    
Giorgi 01.04.2010 15:16
quelle
0

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.

    
casperOne 01.04.2010 15:23
quelle
0

Nur das -

%Vor%     
Maxim 27.08.2010 16:30
quelle
-1

In Linq:

%Vor%

(Ihre Erklärung scheint zu sagen, dass Sie die eindeutigen Elemente in beiden Listen haben möchten. Aber Ihr Beispiel scheint, dass Sie das union beider Listen wollen).

    
Keltex 01.04.2010 15:17
quelle

Tags und Links