2012-03-01 11 views
28

Ho due liste:Trova se elencoA contiene elementi non in elencoB

List<int> listA  
List<int> listB 

come controllare utilizzando LINQ se nella listA esiste un elemento wchich deosn't esiste nel listB? Posso utilizzare il ciclo foreach ma mi chiedo se posso fare questo usando LINQ

risposta

72

listA.Except(listB) vi darà tutti gli elementi nell'elencoA che non sono in elencoB

+1

Sì, lo farà. Ma poiché si tratta di un'operazione basata su set, vale la pena ricordare che l'elenco risultante rimuoverà anche i duplicati presenti in ListA o ListB. – Holf

32
if (listA.Except(listB).Any()) 
4

si può fare in un singola linea

var res = listA.Where(n => !listB.Contains(n)); 

questo non è il modo più veloce per farlo: nel caso in cui listB è relativamente lungo, questo dovrebbe essere più veloce:

var setB = new HashSet(listB); 
var res = listA.Where(n => !setB.Contains(n)); 
11
listA.Any(_ => listB.Contains(_)) 

:)

+1

Questa è la migliore soluzione, poiché le soluzioni fornite da @ cadrell0 e SLaks controlleranno solo se A contiene tutti gli elementi di B, ma non se B ha altri elementi che non corrispondono ad A. Questa soluzione è valida per esempio sotto. A: [0,1,2,3]; B: [0,1,2,3,4] 'listA.Except (listB) .Any() == false' ' listA.Any (_ => listB.Contains (_)) == true' –

+0

@TomaszJuszczak Vero, ma la domanda è specificatamente richiesta solo se A contiene qualcosa non in B - vale a dire ** dovrebbe ** valutare a false se B contiene qualcosa non in A fornito A non contiene qualcosa non in B. Quindi questa risposta è errato. (Sì, ho frainteso la domanda quando ho letto per la prima volta.) –

2

lista ha Contiene metodo che tornare bool. Possiamo usare quel metodo nella query.

List<int> listA = new List<int>(); 
List<int> listB = new List<int>(); 
listA.AddRange(new int[] { 1,2,3,4,5 }); 
listB.AddRange(new int[] { 3,5,6,7,8 }); 

var v = from x in listA 
     where !listB.Contains(x) 
     select x; 

foreach (int i in v) 
    Console.WriteLine(i); 
0

Questo pezzo di codice confronta due liste contenenti entrambi un campo per un CultureCode come "en-GB". Questo lascerà le traduzioni non esistenti nella lista. (Avevamo bisogno di un elenco a discesa per le lingue non-tradotte per gli articoli)

var compared = supportedLanguages.Where(sl => !existingTranslations.Any(fmt => fmt.CultureCode == sl.Culture)).ToList();

Problemi correlati