Eliminar elementos de una lista en otro

Estoy intentando descubrir cómo atravesar una lista genérica de elementos que deseo eliminar de otra lista de elementos.

Entonces, digamos que tengo esto como un ejemplo hipotético

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

Quiero atravesar list1 con foreach y eliminar cada elemento en List1 que también está contenido en List2.

No estoy muy seguro de cómo hacerlo ya que foreach no se basa en índices.

Puede usar Excepto :

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

Probablemente ni siquiera necesite esas variables temporales:

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

Tenga en cuenta que Except no modifica ninguna de las listas; crea una nueva lista con el resultado.

No necesita un índice, ya que la clase List permite eliminar elementos por valor en lugar de índice utilizando la función Remove .

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

Yo recomendaría usar los métodos de extensión LINQ . Puedes hacerlo fácilmente con una línea de código como esta:

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

Esto supone, por supuesto, que los objetos en list1 que está eliminando de list2 son la misma instancia.

Podría usar LINQ, pero yo iría con el método RemoveAll . Creo que es el que mejor expresa tu intención.

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

En mi caso, tenía dos listas diferentes, con un identificador común, algo así como una clave externa. La segunda solución citada por “nzrytmn” :

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

Fue el que mejor se ajustaba a mi situación. Necesitaba cargar una DropDownList sin los registros que ya se habían registrado.

Gracias !!!

Este es mi código:

 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)); 

Solución 1: puede hacer esto:

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

Pero en algunos casos puede que esta solución no funcione. si no funciona, puede usar mi segunda solución.

Solución 2:

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

pretendemos que list1 es tu lista principal y list2 es tu lista de segmentación y quieres obtener elementos de list1 sin elementos de list2.

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

Aqui tienes..

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