it-swarm.com.de

Entfernen Sie Elemente aus IEnumerable <T>

Ich habe 2 IEnumerable-Sammlungen.

IEnumerable<MyClass> objectsToExcept 

und 

IEnumerable<MyClass> allObjects.

objectsToExcept kann Objekte aus allObjects enthalten.

Ich muss Objekte aus allObjects in objectsToExcept entfernen. Zum Beispiel:

foreach (var myClass in objectsToExcept)
{
allObjects.Remove(myClass);
}

Oder

allObject.Except(objectsToExcept)

Aber es geht nicht. Die Anzahl nach der Ausführung der Methoden zeigt an, dass keine Elemente entfernt wurden.

44
Maxim

Ich sehe nicht, wie die erste Version kompiliert werden würde, und die zweite Version wird nichts tun, wenn Sie das Ergebnis nicht verwenden. Es entfernt nichts aus der vorhandenen Sammlung - in der Tat kann es nicht einmal be eine In-Memory-Sammlung geben, die es unterstützt. Es wird nur eine Sequenz zurückgegeben, die bei Wiederholung die entsprechenden Werte zurückgibt.

Wenn Sie sind das Ergebnis verwenden, z.

IEnumerable<MyClass> others = allObjects.Except(objectsToExcept);
foreach (MyClass x in others)
{
    ...
}

dann sollte es in Ordnung sein if Sie haben GetHashCode und Equalsoder überschrieben, wenn Sie gerne Referenzgleichheit verwenden. Versuchen Sie, logisch gleiche Werte zu entfernen, oder treten die gleichen Referenzen in beiden Sequenzen auf? Haben Sie GetHashCode und Equals überschrieben, und wenn ja, sind Sie sicher, dass diese Implementierungen funktionieren?

Grundsätzlich sollte es in Ordnung sein - ich schlage vor, Sie versuchen ein kurzes, aber vollständiges Programm zu erstellen, das das Problem veranschaulicht. Ich vermute, dass Sie dabei herausfinden, was falsch ist.

57
Jon Skeet

Es gibt keine Remove-Methode für IEnumerable<T>, da sie nicht modifizierbar sein soll.

Die Except-Methode ändert die ursprüngliche Sammlung nicht: Sie gibt eine neue Sammlung zurück, die nicht die ausgeschlossenen Elemente enthält:

var notExcluded = allObjects.Except(objectsToExcept);

Siehe Except unter MSDN .

29
Thomas Levesque

Remove und Except das ursprüngliche IEnumerable nicht ändern. Sie geben einen neuen zurück. Versuchen

var result = allObject.Except(objectsToexcept);
16
Mike Two

Während die anderen Antworten korrekt sind, muss ich hinzufügen, dass das Ergebnis des Aufrufs Except() wieder der ursprünglichen Variablen zugewiesen werden kann. Das ist,

allObjects = allObjects.Except(objectsToExcept);

Denken Sie auch daran, dass Except() die eingestellte Differenz der beiden Sammlungen erzeugt. Wenn also Duplikate der zu entfernenden Variablen vorhanden sind, werden sie alle entfernt.

4
lordcheeto
others.Where(contract => !objectsToExcept.Any()).ToList();
0
MikroDel