c# - 如何在 Linq 中进行汇总?

标签 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 查询产生这些结果? 我可以重复迭代数据并在标准循环中添加到结果中,但这听起来像是错误的方法。

感谢您的帮助:)

最佳答案

这是我知道的最简单的方法:

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

关于c# - 如何在 Linq 中进行汇总?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7171549/

相关文章:

c# - C#中的整数溢出左​​移

linq - 使用 LINQ 获取未连接的不同项

c# - Linq Join 将所有字段保留在一侧而不显式列出

c# - 调用 LINQ First() 方法时出现 InvalidArgument 错误

c# - 即使文件正在使用中,如何在 C# 中压缩文件夹内容

c# - 名称如何工作?

c# - 如何在 C# 中将 .zip 文件视为目录?

c# - 使用 LINQ 查询获取包含当前列表中任何数值的新列表

c# - 重构 LINQ 方法

c# - WinForm设计器错误打开设计器