web-dev-qa-db-ja.com

linqを使用してリストから値の合計を取得しますか?

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.
14
user2721874
var grouped = allData.GroupBy(x => x[0])
                     .Select(g => new
                     {
                         Name = g.Key,
                         Sum = g.Sum(x => int.Parse(x[2]))
                     });

グループごとに匿名タイプのインスタンスを返します。2つのプロパティがあります。グループ化キーを含むNameと、マークの合計を含むSumです。

9
MarcinJuraszek

すべてのグループの合計を取得するか、合計を取得するかは不明です。それが合計の場合、これはトリックを行う必要があります

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]));
26
JaredPar

これにより、各名前のパラレルリストと、各名前の出現回数がわかります。

    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());
0
JustSomeDude

可能な限り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