Estoy tratando de descubrir cómo atravesar una lista genérica de elementos que quiero eliminar de otra lista de elementos.
Digamos que tengo esto como un ejemplo hipotético
List<car> list1 = GetTheList();
List<car> list2 = GetSomeOtherList();
Quiero atravesar list1 con un 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 está basado en índices.
list1
que existen enlist2
o desea eliminar los elementoslist2
que existen enlist1
? En el momento de este comentario, cada respuesta proporcionada realizará la última.Respuestas:
Puedes usar Excepto :
Probablemente ni siquiera necesite esas variables temporales:
Tenga en cuenta que
Except
no modifica ninguna de las listas: crea una nueva lista con el resultado.fuente
IEnumerable<car>
, no unList<car>
. Debe llamarToList()
para recuperar una lista. Además, creo que debería serGetSomeOtherList().Except(GetTheList()).ToList()
using System.Linq;
si no lo tenía antes.Except
ya que esto realmente realiza una operación de configuración , que distingue la lista resultante. No esperaba este comportamiento ya que estoy usando aList
, no aHashSet
. Relacionado.No necesita un índice, ya que la
List<T>
clase le permite eliminar elementos por valor en lugar de índice mediante laRemove
función.fuente
list2.Remove(item);
declaración.list1.ForEach(c => list2.Remove(c));
Recomendaría usar los métodos de extensión LINQ . Puede hacerlo fácilmente con una línea de código de esta manera:
Esto supone, por supuesto, que los objetos en list1 que está eliminando de list2 son la misma instancia.
fuente
En mi caso, tenía dos listas diferentes, con un identificador común, algo así como una clave foránea. La segunda solución citada por "nzrytmn" :
Fue el que mejor encajó en mi situación. Necesitaba cargar una DropDownList sin los registros que ya se habían registrado.
Gracias !!!
Este es mi código:
fuente
Podrías usar LINQ, pero yo iría con el
RemoveAll
método. Creo que es el que mejor expresa tu intención.fuente
fuente
O(N)
, esto conducirá a loO(N^2)
que podría ser un problema con listas grandes.Solución 1: puede hacer esto:
Pero en algunos casos puede que esta solución no funcione. si no es trabajo puedes usar mi segunda solución.
Solución 2:
Suponemos que list1 es su lista principal y list2 es su segunda lista y desea obtener elementos de list1 sin elementos de list2.
fuente
Como
Except
no modifica la lista, puede usar ForEach enList<T>
:Puede que no sea la forma más eficiente, pero es simple, por lo tanto legible, y actualiza la lista original (que es mi requisito).
fuente
Aqui tienes..
fuente