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 list1 = GetTheList(); List 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.

Vous pouvez utiliser sauf :

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

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

 List result = GetSomeOtherList().Except(GetTheList()).ToList(); 

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

Vous n’avez pas besoin d’index, car la classe List vous permet de supprimer des éléments par valeur plutôt que par index en utilisant la fonction Remove .

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

Je recommande d’utiliser les méthodes d’extension LINQ . Vous pouvez facilement le faire avec une seule ligne de code comme ceci:

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

Cela suppose bien sûr que les objects de list1 que vous supprimez de list2 sont la même instance.

Vous pourriez utiliser LINQ, mais j’irais avec la méthode RemoveAll . Je pense que c’est celui qui exprime le mieux votre intention.

 var integers = new List { 1, 2, 3, 4, 5 }; var remove = new List { 1, 3, 5 }; integers.RemoveAll(i => remove.Contains(i)); 

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” :

 var result = list1.Where(p => !list2.Any(x => x.ID == p.ID && x.property1 == p.property1)).ToList(); 

Était celui qui correspondait le mieux à ma situation. Je devais charger un DropDownList sans les enregistrements déjà enregistrés.

Je vous remercie !!!

Ceci est mon code:

 t1 = new T1(); t2 = new T2(); List list1 = t1.getList(); List list2 = t2.getList(); ddlT3.DataSource= list2.Where(s => !list1.Any(p => p.Id == s.ID)).ToList(); ddlT3.DataTextField = "AnyThing"; ddlT3.DataValueField = "IdAnyThing"; ddlT3.DataBind(); 
 list1.RemoveAll(l => list2.Contains(l)); 

Solution 1: Vous pouvez faire comme ceci:

 List result = GetSomeOtherList().Except(GetTheList()).ToList(); 

Mais dans certains cas, cette solution peut ne pas fonctionner. Si cela ne fonctionne pas, vous pouvez utiliser ma deuxième solution.

Solution 2:

 List list1 = GetTheList(); List list2 = GetSomeOtherList(); 

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.

  var result = list1.Where(p => !list2.Any(x => x.ID == p.ID && x.property1 == p.property1)).ToList(); 

Voila ..

  List list = new List() { "1", "2", "3" }; List remove = new List() { "2" }; list.ForEach(s => { if (remove.Contains(s)) { list.Remove(s); } });