Ich versuche herauszufinden, wie eine generische Liste von Elementen durchlaufen wird, die ich aus einer anderen Liste von Elementen entfernen möchte.
Nehmen wir also an, ich habe dies als hypothetisches Beispiel
List<car> list1 = GetTheList();
List<car> list2 = GetSomeOtherList();
Ich möchte list1 mit einem foreach durchlaufen und jedes Element in List1 entfernen, das auch in List2 enthalten ist.
Ich bin mir nicht ganz sicher, wie ich das anstellen soll, da foreach nicht indexbasiert ist.
list1
, die in vorhanden sindlist2
, oder möchten Sie die Elemente entfernenlist2
, die in vorhanden sindlist1
? Zum Zeitpunkt dieses Kommentars führt jede Antwort die letztere aus.Antworten:
Sie können Außer verwenden :
Sie benötigen wahrscheinlich nicht einmal diese temporären Variablen:
Beachten Sie, dass
Except
keine der beiden Listen geändert wird. Es wird eine neue Liste mit dem Ergebnis erstellt.quelle
IEnumerable<car>
, kein a erzeugenList<car>
. Sie müssen anrufenToList()
, um eine Liste zurück zu bekommen. Darüber hinaus glaube ich, dass es sein sollteGetSomeOtherList().Except(GetTheList()).ToList()
using System.Linq;
wenn Sie es vorher nicht hatten.Except
da dies tatsächlich eine festgelegte Operation ausführt , die die resultierende Liste unterscheidet. Ich habe dieses Verhalten nicht erwartet, da ich a verwendeList
, nicht aHashSet
. Verbunden.Sie benötigen keinen Index, da Sie mit der
List<T>
Klasse Elemente mithilfe derRemove
Funktion nach Wert und nicht nach Index entfernen können .quelle
list2.Remove(item);
Anweisung verwenden.list1.ForEach(c => list2.Remove(c));
Ich würde empfehlen, die LINQ-Erweiterungsmethoden zu verwenden . Sie können dies einfach mit einer Codezeile wie folgt tun:
Dies setzt natürlich voraus, dass die Objekte in Liste1, die Sie aus Liste2 entfernen, dieselbe Instanz sind.
quelle
In meinem Fall hatte ich zwei verschiedene Listen mit einer gemeinsamen Kennung, ähnlich einem Fremdschlüssel. Die zweite von "nzrytmn" zitierte Lösung :
War derjenige, der am besten in meine Situation passte. Ich musste eine DropDownList ohne die bereits registrierten Datensätze laden.
Danke !!!
Das ist mein Code:
quelle
Sie könnten LINQ verwenden, aber ich würde mit
RemoveAll
Methode gehen . Ich denke, das ist derjenige, der Ihre Absicht besser zum Ausdruck bringt.quelle
quelle
O(N)
, kann diesO(N^2)
bei großen Listen zu Problemen führen.Lösung 1: Sie können Folgendes tun:
In einigen Fällen funktioniert diese Lösung jedoch möglicherweise nicht. Wenn es nicht funktioniert, können Sie meine zweite Lösung verwenden.
Lösung 2:
Wir geben vor, dass list1 Ihre Hauptliste und list2 Ihre Secondry-Liste ist und Sie Elemente von list1 ohne Elemente von list2 erhalten möchten.
quelle
Da
Except
die Liste nicht geändert wird , können Sie ForEach verwenden fürList<T>
:Es ist vielleicht nicht der effizienteste Weg, aber es ist einfach, daher lesbar und aktualisiert die ursprüngliche Liste (was meine Anforderung ist).
quelle
Hier gehts ..
quelle