Ho due raccolte di oggetti (Elenco lista1 e Lista lista2). C'è una proprietà su ciascun "ID" chiamato. So che list2 avrà sempre più oggetti di list1, ho solo bisogno di un modo semplice per ottenere una collezione di tutti gli elementi esistenti in list2 ma non lista1 usando le espressioni lambda LINQ.LINQ Lambda - Trova tutti gli ID in una lista che non esiste in un'altra lista
16
A
risposta
34
Se solo bisogno degli ID degli articoli quindi Mark's answer farà bene il trucco. Se è necessario restituire gli oggetti stessi (e che non hanno già un adeguato Equals
implementazione) allora si potrebbe provare qualcosa di simile:
// 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
Questo ti porterà gli ID che sono solo in lista2:
var ids = list2.Select(x => x.Id).Except(list1.Select(x => x.Id));
Se gli oggetti risultano uguali quando hanno lo stesso ID, allora è possibile semplificare a:
var objects = list2.Except(list1);
Problemi correlati
- 1. Trova tutti gli elementi corrispondenti in std :: lista
- 2. Seleziona dalla lista Lambda o linq
- 3. quadratura tutti gli elementi in una lista
- 4. Trova un elemento in Lista per LINQ?
- 5. Trova gli indici dalla lista in Elixir
- 6. Lista spianatrice in LINQ
- 7. Come posso tagliare tutti gli elementi in una lista?
- 8. Trova tutti gli elementi la cui proprietà della raccolta contiene elementi in un'altra lista
- 9. Sommare gli elementi in una lista
- 10. Domande Django: come filtrare gli oggetti per escludere l'id che si trova in una lista?
- 11. Linq lista di liste a lista singola
- 12. Deseleziona tutti gli elementi durante il SelectedItem è tenuto a qualcosa che non esiste nella lista
- 13. Java 8 modo idiomatico per applicare una Lambda a una lista che restituisce un'altra lista?
- 14. ottiene l'ultimo nella lista LINQ
- 15. Scala - Converti Lista di liste in una singola Lista: Lista [Lista [A]] in Lista [A]
- 16. estrarre gli elementi non nulli da una lista in R
- 17. Come memorizzare gli indici in una lista
- 18. lista infinita linq da una lista finita data
- 19. C# LINQ selezionare dalla lista
- 20. Come eliminare tutti gli articoli dalla lista?
- 21. Come trovare se un elemento di una lista si trova in un'altra lista?
- 22. LINQ: come ottenere elementi da una lista interna in una lista?
- 23. Query Linq che utilizza la lista o la matrice di id
- 24. lista lambda di combinare stringa
- 25. cancella dove id nella lista
- 26. Ottenere gli ID di tutti gli oggetti in un elenco
- 27. Lista IP tutti gli indirizzi di una sottorete
- 28. Come unire tutti gli elementi della lista in R?
- 29. contiene un ID in linq
- 30. Stampa di tutti gli oggetti in lista di array
Perché messo in un hashset? (Potrebbe fare: var ids = list1.Select (x => x.ID);) –
@ David_001: Si potrebbe fare ciò, ma poi la ricerca 'Contains' sarebbe O (n), piuttosto che O (1), facendo la query nel suo insieme O (n * m) piuttosto che O (n + m). Certo, questo probabilmente non sarebbe evidente per le collezioni più piccole, ma se ci fossero molti elementi, le prestazioni sarebbero davvero senza la ricerca O (1) fornita da 'HashSet'. –
LukeH
Sì, non avevo considerato le prestazioni. HashSet sarà molto più veloce in quasi tutte le situazioni, ma soprattutto per le grandi dimensioni di list2. Per questo motivo è la migliore soluzione a questo problema, ma penso che potresti aver trascurato il costo del costruttore per HashSet nelle tue grandi somme. In particolare, se list2 sarà molto piccolo (ad esempio 10 voci), Contains non è l'unico collo di bottiglia, la creazione dell'elenco di id è, e quanto segue sarà più veloce (indipendentemente dalla dimensione di list1): "var ids = list1.Select (x => x.ID) .ToList(); " –