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.
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 Equals
oder ü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.
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 .
Remove und Except das ursprüngliche IEnumerable nicht ändern. Sie geben einen neuen zurück. Versuchen
var result = allObject.Except(objectsToexcept);
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.
others.Where(contract => !objectsToExcept.Any()).ToList();