2014-07-14 11 views
7

abbiamo una struttura semplice, che è solo una lista di liste, in questo modo ...È possibile utilizzare Linq per ottenere un conteggio totale di elementi in un elenco di elenchi?

var fooInfo = new List<List<Foo>>(); 

mi chiedo se c'è un modo semplice possiamo usare LINQ to restituire il totale di tutti gli elementi dall'interno elenchi. Per esempio, se abbiamo avuto questa ...

fooInfo.add(new List<Foo>()); // First list within the outer list 
fooInfo.add(new List<Foo>()); // Second list within the outer list 
fooInfo.add(new List<Foo>()); // Third list within the outer list 

// Add two items to the first inner list 
fooInfo[0].add(new Foo()); 
fooInfo[0].add(new Foo()); 

// Add one item to the second inner list 
fooInfo[1].add(new Foo()); 

// Add four items to the third inner list 
fooInfo[2].add(new Foo()); 
fooInfo[2].add(new Foo()); 
fooInfo[2].add(new Foo()); 
fooInfo[2].add(new Foo()); 

... avremmo tre liste con due, uno e quattro voci, rispettivamente, il che significa il totale degli oggetti 'Foo' sono sette. Questo è il numero che spero di recuperare tramite linq piuttosto che dover scrivere il nostro codice di looping e verificarlo manualmente.

ad es.

var totalFoos = fooInfo.LINQToGetTotalFoos(); 

piuttosto che ....

int totalFoos = 0; 

foreach(var childList in fooInfo) 
    totalFoos += childList.Count(); 

risposta

9

Un semplice Enumerable.Sum sarebbe sufficiente.

var totalFoos = fooInfo.Sum(childList => childList.Count); 

calcola la somma della sequenza di valori Int32 ottenuti chiamando una funzione di trasformazione su ogni elemento della sequenza di input.

È possibile utilizzare SelectMany ma le prestazioni di questo sarebbe meglio.

5

Usa SelectMany e Count:

var nbOfItems = source.SelectMany(x => x).Count(); 

o Select, Count e Sum:

var nbOfItems = source.Select(x => x.Count()).Sum(); 

Quest'ultimo funzionerà meglio, perché non enumererà tutti gli elementi come SelectMany.

+0

@NikhilAgrawal 'Enumerable .Count()' verifica se il target implementa 'ICollection ' (e per questo ha la proprietà 'Count') e lo usa se lo fa. – MarcinJuraszek

+0

Sì. Punto valido La mia preoccupazione era di usare 'List.Count' invece di' IEnumerable.Count'. Ciò renderebbe le tue domande più leggere. –

+0

Leggi questo http://stackoverflow.com/questions/981254/is-the-linq-count-faster-or-slower-than-list-count-or-array-length –

Problemi correlati