Supprimer des éléments de IEnumerable<T>
J'ai 2 IEnumerable collections.
IEnumerable<MyClass> objectsToExcept
et
IEnumerable<MyClass> allObjects.
objectsToExcept
peut contenir des objets de allObjects
.
J'ai besoin de retirer de allObjects
objets dans objectsToExcept
. Par exemple:
foreach (var myClass in objectsToExcept)
{
allObjects.Remove(myClass);
}
Ou
allObject.Except(objectsToExcept)
Mais ça ne fonctionne pas. Le comte, après les méthodes exécuter indiquent qu'aucun des éléments ont été supprimés.
Vous devez vous connecter pour publier un commentaire.
Je ne vois pas comment la première version de la compilation, et la deuxième version ne sera pas faire quelque chose, sauf si vous utilisez le résultat. Il n'a pas d'enlever quoi que ce soit à partir de la collection existante, - en effet, il peut même ne pas être une collection en mémoire sauvegarde. Elle retourne une séquence qui, lors de l'itération en cours, sera de retour avec les valeurs appropriées.
Si vous sont utilisant le résultat, par exemple
il devrait être bon si vous avez remplacé les
GetHashCode
etEquals
ou si vous êtes heureux d'utiliser la référence à l'égalité. Êtes-vous essayer de supprimer logiquement des valeurs égales, ou en faire de même références se produire dans les deux séquences? Avez-vous remplacéGetHashCode
etEquals
, et si oui, êtes-vous sûr que ces implémentations travail?Fondamentalement, il doit être fine - je vous suggère d'essayer de créer une courte mais complète du programme qui illustre le problème, je soupçonne que tout en faisant ainsi, vous allez trouver ce qui ne va pas.
Il n'y a pas de
Remove
méthode surIEnumerable<T>
, car il n'est pas destiné à être modifiable.La
Except
méthode ne prend pas en modifier l'original de la collection: elle retourne une nouvelle collection qui ne contient pas les éléments exclus:Voir
Except
sur MSDN.Remove
existe comme une extension de la méthode dans le Linq to XML de l'espace, mais ne fait pas ce que l'OP est en train de faire. Curieusement vous le voyez sur la page de documentation pour les membres deIEnumerable<T>
mais il a une restrictionwhere T : XNode
. TechniquementExcept
n'est pas surIEnumerable<T>
soit, mais qui est absolument trop pointilleux.Enlever et à l'Exception de ne pas en modifier l'original IEnumerable. Ils reviennent une nouvelle. essayez
Tandis que les autres réponses sont correctes, je dois ajouter que le résultat de la
Except()
appel peut être affecté à la variable d'origine. C'est,Également garder à l'esprit que
Except()
va produire de la différence entre les deux collections, donc si il y a des doublons des variables qui doivent être supprimés, ils seront tous supprimés.