【问题标题】:Get sum of the value from list using linq?使用linq从列表中获取值的总和?
【发布时间】:2014-02-28 05:05:43
【问题描述】:

我正在尝试使用 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]);

在此之后,我将所有匹配的名称归为一个,但现在如何获得该组的分数总和?有什么帮助会很好吗?

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

【问题讨论】:

  • 要添加的数字是否总是每个列表的第三个元素?
  • @BrianSnow 是的,它永远是第三个元素

标签: c# linq list c#-3.0


【解决方案1】:

不确定您是要获取每个组的总和还是总数。如果是总数,那么这应该可以解决问题

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

【讨论】:

    【解决方案2】:
    var grouped = allData.GroupBy(x => x[0])
                         .Select(g => new
                         {
                             Name = g.Key,
                             Sum = g.Sum(x => int.Parse(x[2]))
                         });
    

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

    【讨论】:

      【解决方案3】:

      尽可能坚持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]))
                    };
      

      【讨论】:

        【解决方案4】:

        这将为您提供每个名称的平行列表以及每个名称出现的次数。

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

        【讨论】:

        • 如果您查看我想要内部列表中第三个元素的总和的问题,我不想要名称计数。
        • 哦,对不起。我对“输出”行感到困惑......它说“输出应该是 name1-27 和 name=15 等等......” - >应该是:“输出应该是 name1 = 27 和 name2 = 15 以此类推……”.....无论哪种方式,我都学到了一些新东西,这是一个独特的问题,这些都是解决您问题的好方法!
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-20
        • 1970-01-01
        • 1970-01-01
        • 2021-11-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多