2010-09-30 15 views

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)); 
+0

Perché messo in un hashset? (Potrebbe fare: var ids = list1.Select (x => x.ID);) –

+1

@ 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

+0

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(); " –

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