2009-10-07 7 views
1

Imaginez la liste suivante:Comment compter les éléments d'une liste dans une liste dans une liste en utilisant LINQ?

List<List<List<String>>> listRoot = new List<List<List<String>>>(); 

Je veux compter les éléments de la première et la deuxième liste et retourner la valeur accumulée:

int iFirstListCounter = 0; 
    int iSecondListCounter = 0; 

    foreach (List<List<String>> listFirst in listRoot) 
    { 

     iFirstListCounter += listFirst.Count; 

     foreach (List<String> listSecond in listFirst) 
     { 

      iSecondListCounter += listSecond.Count; 

     } 

    } 

    return iFirstListCounter + iSecondListCounter; 

Je me demande s'il est possible de le faire en utilisant LINQ?

+0

@Rex êtes-vous fou? –

+0

Je pense que Rex pensait à la concaténation des chaînes, car la liste la plus interne est une liste de chaînes, et qu'il a réagi à l'opérateur + = qui échoue très mal lorsqu'il est utilisé sur des chaînes dans une boucle. – Guffa

+0

Oui, c'est ce qui est arrivé. Désolé :) –

Répondre

3
int iTotalListCounter = listRoot.Sum(x => (x.Count + x.Sum(y => y.Count))); 
+0

L'affiche originale a demandé deux valeurs. Vous n'en fournissez qu'un seul. –

+0

@Eric, je pense qu'il a seulement demandé la somme totale, même si vous avez raison de dire qu'il a des variables pour les deux. La meilleure question est pourquoi était-ce la réponse acceptée quand elle est identique à la mienne? ;) –

+1

Ah, je vois ce que vous voulez dire. C'est une question formulée de manière confuse, et je ne comprends pas pourquoi la somme est même pertinente. Cela semble être une chose étrange à résumer. –

4
listRoot.SelectMany(l => l.SelectMany(li => li)).Count() 
+0

Certainement mieux que la réponse acceptée. –

+0

Joel, puisque ni cette réponse ni la réponse acceptée ne répondent correctement au problème énoncé, lequel "mieux" semble académique au mieux. :) –

+0

Bien qu'à peu près aussi lisible. –

4
int totalCount = listRoot.Sum(x => x.Count + x.Sum(y => y.Count)); 
4

Cela devrait le faire:

int firstListCounter = listRoot.Sum(f => f.Count); 
int secondListCount = listRoot.Sum(f => f.Sum(s => s.Count)); 
Questions connexes