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.
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.
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]));
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());
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]))
};