使用linq从列表中获取值的总和?

时间:2014-02-28 05:05:43

标签: c# linq list c#-3.0

我想使用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 ....

我已经申请了分组给我按名称分组,但我无法弄清楚如何得到每个名字的分数总和?

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

在此之后,我将所有匹配的名称分组为一个,但现在如何获得该组的标记总和?任何帮助都会很棒?

  Output should be  name1=27 and name2=15 and so on.

4 个答案:

答案 0 :(得分:19)

不确定是否要获得每个组或总数的总和。如果它是总数那么这应该做的伎俩

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

答案 1 :(得分:7)

var grouped = allData.GroupBy(x => x[0])
                     .Select(g => new
                     {
                         Name = g.Key,
                         Sum = g.Sum(x => int.Parse(x[2]))
                     });

它将为每个组返回一个匿名类型实例,其中包含两个属性:Name包含您的分组键,Sum包含标记总和。

答案 2 :(得分:0)

这将为您提供并行列表,其中包含每个名称以及每个名称出现次数的计数。

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

另外......您可能希望在将alldata分配给分组时添加此项。我使用它来获取列表从最大到最少的出现次数。

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

答案 3 :(得分:0)

尽可能多地使用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]))
              };