如何在Linq中进行汇总?

时间:2011-08-24 06:53:06

标签: c# linq

如果之前有人问过,请道歉,但我不确定我是否提出了正确的问题。 这是我的问题:

我有

等数据
AA01 JAN 100
AA01 JAN 200
AA01 FEB 200
AA02 JAN 50
AA03 FEB 500
AA03 MAR 250
AA03 MAR 75

我想把它变成IEnumerable的结果,看起来像是:

Result{
  string Key,
  int Jan,
  int Feb,
  int Mar,
  ...
 }

IEnumerable<Result> results = .....
KEY   JAN   FEB   MAR
AA01  300   200     0
AA02   50     0     0
AA03    0   500   325

月份列是固定的,如果这有帮助,但我无法弄清楚如何获得linq查询来产生这些结果? 我可以重复迭代数据并在标准循环中添加结果,但这听起来像是错误的方式。

感谢您的任何帮助:)

3 个答案:

答案 0 :(得分:1)

这是我知道如何最简单的方式:

var query =
    from r in records
    group r by r.Key into grs
    let ms = grs.ToLookup(gr => gr.Month, gr => gr.Value)
    select new
    {
        grs.Key,
        JAN = ms["JAN"].Sum(),
        FEB = ms["FEB"].Sum(),
        MAR = ms["MAR"].Sum(),
        // ...
        DEC = ms["DEC"].Sum(),
    };

从计算的角度来看,不完全以您想要的格式更灵活的替代方案是:

var months = Enumerable
    .Range(0, 12)
    .Select(m =>
        String
            .Format("{0:MMM}", new DateTime(2011, m + 1, 1))
            .ToUpper());

var query =
    from r in records
    group r by r.Key into grs
    let ms = grs.ToLookup(gr => gr.Month, gr => gr.Value)
    select new
    {
        grs.Key,
        Months =
            from m in months
            select ms[m].Sum(),
    };

答案 1 :(得分:0)

我不确定如何直接在Linq中执行此操作,但一种方法是执行以下操作:

  1. 获取所有不同的密钥(var keys = myData.Select(d => d.Key).Distinct();
  2. 创建Dictionary<String, Dictionary<String, Int32>> - 这会将您的密钥作为第一个字典的键,而将月份作为第二个字典的键
  3. 迭代您的不同密钥和月份,并将所有值添加到字典中,这样您就可以有效地使用0表
  4. 迭代您的数据并执行相关查找并根据需要添加数字

答案 2 :(得分:0)

这里提供了非常有趣的解决方案

https://blogs.msdn.microsoft.com/mitsu/2007/12/21/playing-with-linq-grouping-groupbymany/

它描述了如何通过几个属性执行groupbby。即:

var result = customers.GroupByMany(c => c.Country, c => c.City);