J'ai 2 collections IEnumerable.
IEnumerable<MyClass> objectsToExcept
et
IEnumerable<MyClass> allObjects.
objectsToExcept
peut contenir des objets de allObjects
.
Je dois supprimer des objets allObjects
dans objectsToExcept
. Par exemple:
foreach (var myClass in objectsToExcept)
{
allObjects.Remove(myClass);
}
Ou
allObject.Except(objectsToExcept)
Mais ça ne marche pas. Le nombre après l'exécution des méthodes indique qu'aucun élément n'a été supprimé.
Il n'y a pas de méthode Remove
sur IEnumerable<T>
, car elle n'est pas censée être modifiable.
La méthode Except
ne modifie pas la collection d'origine: elle retourne une nouvelle collection qui ne contient pas les éléments exclus:
var notExcluded = allObjects.Except(objectsToExcept);
Voir Except
sur MSDN .
Remove et Except ne modifient pas l'IEnumerable d'origine. Ils en retournent un nouveau. essayer
var result = allObject.Except(objectsToexcept);
Bien que les autres réponses soient correctes, je dois ajouter que le résultat de l'appel Except()
peut être attribué à la variable d'origine. C'est,
allObjects = allObjects.Except(objectsToExcept);
N'oubliez pas non plus que Except()
produira la différence définie des deux collections, donc s'il existe des doublons des variables à supprimer, elles seront toutes supprimées.
others.Where(contract => !objectsToExcept.Any()).ToList();