Tengo dos colecciones de objetos (Lista lista1 y Lista lista2). Hay una propiedad en cada llamada "ID". Sé que list2 siempre tendrá más elementos que list1, solo necesito una forma fácil de obtener una colección de todos los elementos que existen en list2 pero no en list1 utilizando expresiones LINQ lambda.LINQ Lambda: busque todas las ID en una lista que no exista en otra lista
16
A
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));
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
- 1. ¿Convertir o asignar una lista de clase a otra lista de clase utilizando Lambda o LINQ?
- 2. lista contiene un ID en linq
- 3. Seleccionar de la lista Lambda o linq
- 4. Use LINQ para obtener elementos en una Lista <>, que no están en otra Lista <>
- 5. LINQ: Cómo anexar lista de elementos en otra lista
- 6. lista de consultas LINQ contiene una lista
- 7. LINQ: busque todas las casillas marcadas en un GridView
- 8. Python, lambda, busque mínimo
- 9. Clasificación de lista basada en otra lista
- 10. ¿Usar LINQ para encontrar todas las claves de una colección que no están en otra?
- 11. Busque una lista de pruebas rspec lentas
- 12. ¿Eliminar instancias de una lista utilizando LINQ o Lambda?
- 13. LINQ - Excepto una lista con los elementos de otra
- 14. Ordenar una lista por otra
- 15. ¿Cómo inserto una lista en otra lista en python?
- 16. Insertar una lista en otra lista en Redis
- 17. filtrar una lista utilizando LINQ
- 18. SQL NO EN [lista de ID] (rendimiento)
- 19. Cómo convertir todas las cadenas en la lista <string> a minúsculas usando LINQ?
- 20. LINQ para verificar si existe ID en la lista
- 21. dividir una lista utilizando LINQ
- 22. Lambda que devuelve otra lambda
- 23. ¿Cómo ordenar una lista según otra lista?
- 24. En Python, ¿cómo indexo una lista con otra lista?
- 25. añadir una lista a otra lista en vb.net
- 26. LINQ Unirse para buscar elementos NO EN una lista
- 27. Haciendo todas las combinaciones posibles de una lista en python
- 28. conseguir todas las combinaciones posibles en una lista
- 29. ¿Agregar una lista a otra lista en java?
- 30. ¿Cómo obtengo todas las filas en una tabla que no están en otra en MS Access?
¿Por qué poner en un hashset? (Podría hacer: var ids = list1.Select (x => x.ID);) –
@ 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
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(); " –