2011-10-03 27 views
7

He estado buscando algo así durante días. Estoy tratando de eliminar todos los elementos de una lista más grande A según una lista B.Eliminar una lista de objetos de otra lista

Supongamos que tengo una lista general con 100 elementos con diferentes IDS y obtengo otra lista con elementos específicos con solo 10 registros. Necesito eliminar todos los elementos de la primera lista que no existe dentro de la segunda lista.

Trataré de mostrar el código que realmente no sé cómo no funcionó.

List<Obj> listA = new List<Obj>(); 
List<Obj> listB = new List<Obj>(); 

//here I load my first list with many elements 
//here I load my second list with some specific elements 

listA.RemoveAll(x => !listB.Contains(x)); 

No sé por qué pero no está funcionando. Si pruebo este ejemplo con un tipo List<int>, funciona bien, pero me gustaría hacerlo con mi objeto. Este objeto obtuvo una identificación pero no sé cómo usar esta identificación dentro de la oración LINQ.

+1

El problema es el contiene ya que ambas listas no contienen el mismo objeto (puede ser otra instancia de la misma clase, pero con los mismos datos). – HiperiX

+0

¿anuló Equals/GetHashcode en su tipo Obj para usar el campo ID en lugar del método heredado de System.Object? –

+0

Mis objetos tienen el mismo tipo pero diferente contenido, solo tienen que comparar los ID y no el objeto completo. Acabo de seguir IAbstract ~ respuesta y funcionó como un amuleto ... ¡Gracias, muchachos! –

Respuesta

20

Es necesario comparar los ID:

listA.RemoveAll(x => !listB.Any(y => y.ID == x.ID)); 

List(T).RemoveAll

+0

¡Funcionó como un encanto! Gracias a todos por la ayuda ! –

+0

¿cuál es el espacio de nombres para el método de extensión RemoveAll? Yo no lo tengo – Arash

+0

Arash, es parte de List. Apuesto a que deberías llamar a .ToList() en tu IEnumerable – Joe

0

Si desea eliminar una lista de objetos (listB) de otra lista (listA) usan:

listA = listA.Except(listB).ToList() 

recuerde utilizar ToList() para convertir IEnumerable<Obj> a List<Obj>.

Cuestiones relacionadas