sacar - reemplazar un elemento de una lista c#
Eliminar elementos de una lista en otro (8)
Aqui tienes..
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);
}
});
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<car> list1 = GetTheList();
List<car> 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.
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<T1> list1 = t1.getList();
List<T2> list2 = t2.getList();
ddlT3.DataSource= list2.Where(s => !list1.Any(p => p.Id == s.ID)).ToList();
ddlT3.DataTextField = "AnyThing";
ddlT3.DataValueField = "IdAnyThing";
ddlT3.DataBind();
No necesita un índice, ya que la clase List<T>
permite eliminar elementos por valor en lugar de índice utilizando la función Remove
.
foreach(car item in list1) list2.Remove(item);
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<int> { 1, 2, 3, 4, 5 };
var remove = new List<int> { 1, 3, 5 };
integers.RemoveAll(i => remove.Contains(i));
Puede usar Except :
List<car> list1 = GetTheList();
List<car> list2 = GetSomeOtherList();
List<car> result = list2.Except(list1).ToList();
Probablemente ni siquiera necesite esas variables temporales:
List<car> result = GetSomeOtherList().Except(GetTheList()).ToList();
Tenga en cuenta que Except
no modifica ninguna de las listas; crea una nueva lista con el resultado.
Solución 1: puede hacer esto:
List<car> 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<car> list1 = GetTheList();
List<car> 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();
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.
list1.RemoveAll(l => list2.Contains(l));