2010-09-30 8 views

Respuesta

34

Si solo necesita los ID de los artículos, entonces Mark's answer hará el truco muy bien. Si necesita devolver los artículos ellos mismos (y es que aún no tienen una aplicación adecuada Equals) entonces usted podría intentar algo como esto:

// assumes that the ID property is an int - change the generic type if it's not 
var ids = new HashSet<int>(list1.Select(x => x.ID)); 
var results = list2.Where(x => !ids.Contains(x.ID)); 
+0

¿Por qué poner en un hashset? (Podría hacer: var ids = list1.Select (x => x.ID);) –

+1

@ David_001: Podría hacer eso, pero luego la búsqueda 'Contiene' sería O (n), en lugar de O (1), haciendo la consulta como un todo O (n * m) en lugar de O (n + m). Es cierto que esto probablemente no sería notable para colecciones más pequeñas, pero si hubiera muchos elementos, el rendimiento realmente sufriría sin la búsqueda O (1) proporcionada por 'HashSet '. – LukeH

+0

Sí, no había considerado el rendimiento. El HashSet será mucho más rápido en casi todas las situaciones, pero especialmente para grandes tamaños de list2. Por esa razón, es la mejor solución para este problema, pero creo que puede haber pasado por alto el costo del constructor para HashSet en sus grandes sumas O. Específicamente, si list2 va a ser muy pequeño (digamos 10 elementos), Contains no es el único cuello de botella, la creación de la lista ids es, y la siguiente será más rápida (sin importar el tamaño de list1): "var ids = list1.Select (x => x.ID) .ToList(); " –

22

Esto obtendrá los identificadores que son sólo en lista2:

var ids = list2.Select(x => x.Id).Except(list1.Select(x => x.Id)); 

Si los objetos se comparan iguales cuando tienen el mismo ID de entonces se puede simplificar a:

var objects = list2.Except(list1); 
Cuestiones relacionadas