web-dev-qa-db-fra.com

Obtenir la somme de la valeur de la liste en utilisant linq?

J'essaie d'obtenir la somme de la valeur de liste de liste en utilisant linq? Mes données sont comme ci-dessous code 

        List<List<string>> allData = new List<List<string>>();
        using (StreamReader reader = new StreamReader(path))
        {
            while (!reader.EndOfStream)
            {
                List<string> dataList;
                dataList = reader.ReadLine().Split('|').ToList();
                allData.Add(dataList);
            }
        }

ce qui me donne des données dans allData comme ci-dessous 

           allData-->[0]-->[0]-'name1'
                           [1]-'sub'
                           [2]-'12'
                     [1]-->[0]-'name2'
                           [1]-'sub'
                           [2]-'15'  
                     [2]-->[0]-'name1'
                           [1]-'sub2'
                           [2]-'15'
    //and so on ....

j'ai appliqué groupe par qui me donne le regroupement par nom mais je ne suis pas en mesure de comprendre comment obtenir la somme des notes pour chaque nom?

      var grouped = allData.GroupBy(x => x[0]);

après cela, tous les noms correspondants sont regroupés en un, mais comment obtenir la somme des notes pour ce groupe? Toute aide est la bienvenue ?

  Output should be  name1=27 and name2=15 and so on.
9
user2721874
var grouped = allData.GroupBy(x => x[0])
                     .Select(g => new
                     {
                         Name = g.Key,
                         Sum = g.Sum(x => int.Parse(x[2]))
                     });

Il renverra une instance de type anonyme pour chaque groupe, avec deux propriétés: Name avec votre clé de regroupement et Sum avec la somme des marques.

7
MarcinJuraszek

Vous ne savez pas si vous voulez obtenir la somme de chaque groupe ou le total. Si c'est le total alors cela devrait faire l'affaire

var sum = allData.Sum(x => Int32.Parse(x[2]));

Si c'est par clé, essayez ce qui suit

var all = allData
  .GroupBy(x => x[0])
  .Select(x => x.Sum(y => Int32.Parse(y[2]));
18
JaredPar

Cela vous donnera une liste parallèle avec chaque nom et le nombre de fois où chaque nom apparaît.

    var names = grouped.Select(s => s.Key).ToList();
    var nameCount = grouped.Select(s => s.Count()).ToList();

Aussi ... vous voudrez peut-être ajouter ceci lors de l'affectation de toutes les données à des groupes. J'utilise ceci pour obtenir une liste du plus grand au plus petit nombre d'occurrences.

    var grouped = allData.GroupBy(x => x[0]).OrderByDescending(i => i.Count());
0
JustSomeDude

Coller autant que possible au langage de requête LINQ:

var grouped = from d in allData
              group d by i[0] into g
              select new
              {
                  Name = g.Key,
                  Sum = g.Sum(i => int.Parse(i[2]))
              };
0
Paulo Morgado