Linqを使用してリストのリストから値の合計を取得しようとしていますか?私のデータは以下のコードのとおりです
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);
}
}
以下のようにallData
のデータを取得します
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 ....
私はgroup byを適用しましたが、名前でグループ化できますが、各名前のマークの合計を取得する方法を理解できませんか?
var grouped = allData.GroupBy(x => x[0]);
この後、一致するすべての名前を1つにグループ化しますが、そのグループのマークの合計を取得する方法は?どんな助けも素晴らしいでしょう?
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]))
});
グループごとに匿名タイプのインスタンスを返します。2つのプロパティがあります。グループ化キーを含むName
と、マークの合計を含むSum
です。
すべてのグループの合計を取得するか、合計を取得するかは不明です。それが合計の場合、これはトリックを行う必要があります
var sum = allData.Sum(x => Int32.Parse(x[2]));
キーごとの場合は、以下を試してください
var all = allData
.GroupBy(x => x[0])
.Select(x => x.Sum(y => Int32.Parse(y[2]));
これにより、各名前のパラレルリストと、各名前の出現回数がわかります。
var names = grouped.Select(s => s.Key).ToList();
var nameCount = grouped.Select(s => s.Count()).ToList();
また、すべてのデータをグループに割り当てるときに、これを追加することもできます。これを使用して、出現回数の多いものから最も少ないものへのリストを取得します。
var grouped = allData.GroupBy(x => x[0]).OrderByDescending(i => i.Count());
可能な限り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]))
};