web-dev-qa-db-fra.com

Supprimer des éléments de IEnumerable <T>

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é.

44
Maxim

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 .

29
Thomas Levesque

Remove et Except ne modifient pas l'IEnumerable d'origine. Ils en retournent un nouveau. essayer

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

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.

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