J'essaie de comprendre comment parcourir une liste générique d'éléments que je souhaite supprimer d'une autre liste d'éléments.
Alors disons que j'ai ceci comme exemple hypothétique
List<car> list1 = GetTheList();
List<car> list2 = GetSomeOtherList();
Je veux parcourir list1 avec un foreach et supprimer chaque élément de List1 qui est également contenu dans List2.
Je ne sais pas trop comment procéder, car foreach n'est pas basé sur un index.
list1
qui existent danslist2
ou voulez-vous supprimer les élémentslist2
qui existent danslist1
? Au moment de ce commentaire, chaque réponse fournie effectuera cette dernière.Réponses:
Vous pouvez utiliser Except :
Vous n'avez probablement même pas besoin de ces variables temporaires:
Notez que
Except
cela ne modifie aucune des listes - il crée une nouvelle liste avec le résultat.la source
IEnumerable<car>
, pas unList<car>
. Vous devez appelerToList()
pour obtenir une liste. De plus, je pense que ça devrait êtreGetSomeOtherList().Except(GetTheList()).ToList()
using System.Linq;
si vous ne l'aviez pas auparavant.Except
car cela effectue en fait une opération de définition , qui distingue la liste résultante. Je ne m'attendais pas à ce comportement car j'utilise unList
, pas unHashSet
. En relation.Vous n'avez pas besoin d'un index, car la
List<T>
classe vous permet de supprimer des éléments par valeur plutôt que par index en utilisant laRemove
fonction.la source
list2.Remove(item);
déclaration.list1.ForEach(c => list2.Remove(c));
Je recommanderais d'utiliser les méthodes d'extension LINQ . Vous pouvez facilement le faire avec une seule ligne de code comme ceci:
Cela suppose bien sûr que les objets de list1 que vous supprimez de list2 sont la même instance.
la source
Dans mon cas, j'avais deux listes différentes, avec un identifiant commun, un peu comme une clé étrangère. La deuxième solution citée par "nzrytmn" :
C'était celui qui convenait le mieux à ma situation. J'avais besoin de charger une DropDownList sans les enregistrements qui avaient déjà été enregistrés.
Je vous remercie !!!
Voici mon code:
la source
Vous pourriez utiliser LINQ, mais j'irais avec la
RemoveAll
méthode. Je pense que c'est celui qui exprime le mieux votre intention.la source
la source
O(N)
, cela entraîneraO(N^2)
un problème avec les grandes listes.Solution 1: Vous pouvez faire comme ceci:
Mais dans certains cas, cette solution peut ne pas fonctionner. si cela ne fonctionne pas, vous pouvez utiliser ma deuxième solution.
Solution 2:
nous prétendons que list1 est votre liste principale et list2 est votre liste secondaire et que vous voulez obtenir des éléments de list1 sans éléments de list2.
la source
Comme
Except
cela ne modifie pas la liste, vous pouvez utiliser ForEach surList<T>
:Ce n'est peut-être pas le moyen le plus efficace, mais il est simple, donc lisible, et il met à jour la liste d'origine (ce qui est mon exigence).
la source
Ça y est ..
la source