256 votes

Supprimer des éléments d'une liste dans une autre

J'essaie de comprendre comment parcourir une liste générique d'éléments que je veux 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 la liste 1 avec un foreach et supprimer chaque élément de la liste 1 qui est également contenu dans la liste 2.

Je ne suis pas sûr de savoir comment procéder, car foreach n'est pas basé sur un index.

1 votes

Vous voulez supprimer les éléments de la liste 1 qui se trouvent également dans la liste 2 ?

0 votes

Vous devez supprimer des éléments de la liste 1 et les ajouter à la liste 2 ou autre chose ?

0 votes

433voto

Mark Byers Points 318575

Vous pouvez utiliser Sauf :

List<car> list1 = GetTheList();
List<car> list2 = GetSomeOtherList();
List<car> result = list2.Except(list1).ToList();

Vous n'avez probablement même pas besoin de ces variables temporaires :

List<car> result = GetSomeOtherList().Except(GetTheList()).ToList();

Notez que Except ne modifie aucune des deux listes - il crée une nouvelle liste avec le résultat.

16 votes

Un point mineur, mais cela produira un IEnumerable<car> et non un List<car> . Vous devez appeler ToList() pour obtenir une liste en retour. De plus, je crois qu'il devrait être GetSomeOtherList().Except(GetTheList()).ToList()

11 votes

Vous aurez également besoin de using System.Linq; si vous ne l'aviez pas avant.

0 votes

J'ai ajouté l'utilisation de System.Linq mais je ne peux toujours pas accéder à Except. Mais dans mon cas, j'utilise ArrayList. Avez-vous des idées sur la façon de le faire fonctionner avec ArrayList ?

45voto

Adam Robinson Points 88472

Vous n'avez pas besoin d'un index, car la fonction List<T> vous permet de supprimer des éléments par valeur plutôt que par index en utilisant la classe Remove función.

foreach(car item in list1) list2.Remove(item);

4 votes

+1, mais IMO vous devriez utiliser des parenthèses autour de l'élément list2.Remove(item); déclaration.

4 votes

@sr pt : J'utilise toujours des parenthèses sur les instructions qui apparaissent sur une autre ligne, mais pas sur les blocs d'instructions uniques que je peux/doit placer sur la même ligne que l'instruction de contrôle de flux.

1 votes

Tant que vous êtes cohérent, cela n'a pas d'importance si vous utilisez des parenthèses ou non IMO :)

24voto

Berkshire Points 339

Je recommande d'utiliser le Méthodes d'extension LINQ . Vous pouvez facilement le faire avec une ligne de code comme ceci :

list2 = list2.Except(list1).ToList();

Cela suppose bien sûr que les objets de la liste 1 que vous supprimez de la liste 2 sont la même instance.

2 votes

Il supprime également les doublons.

15voto

João Angelo Points 24422

Vous pourriez utiliser LINQ, mais j'opterais pour RemoveAll méthode. Je pense que c'est celle qui exprime le mieux votre intention.

var integers = new List<int> { 1, 2, 3, 4, 5 };

var remove = new List<int> { 1, 3, 5 };

integers.RemoveAll(i => remove.Contains(i));

10 votes

Ou encore plus simple avec les groupes de méthodes, vous pouvez faire - integers.RemoveAll(remove.Contains) ;

0 votes

Cette solution est-elle plus rapide que la méthode LINQ Except ? ou utilise-t-elle moins de ressources ?

-5voto

Ian P Points 7930

Voilà

    List<string> list = new List<string>() { "1", "2", "3" };
    List<string> remove = new List<string>() { "2" };

    list.ForEach(s =>
        {
            if (remove.Contains(s))
            {
                list.Remove(s);
            }
        });

5 votes

-1. Cela déclenchera une exception après la suppression du premier élément. De plus, il est (généralement) préférable de parcourir la liste jusqu'à supprimer car il est généralement plus petit. De plus, cette méthode oblige à traverser plus de listes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X