c#linq extension按季度分组和选择数据,里面缺少月份

时间:2016-08-30 19:32:50

标签: c# linq extension-methods

我的数据包含日期和总和。 我需要按季度计算销售额。 输出按季度返回销售总额数组, 结果[0]是Q1的销售额,结果1是Q2等的销售额

例如输入'sales':

/// {} => { 0, 0, 0, 0}
/// {(1/1/2010, 10), (2/2/2010, 10), (3/3/2010, 10)} => { 30, 0, 0, 0 }
/// {(1/1/2010, 10), (4/4/2010, 10), (10/10/2010, 10)} => { 10, 10, 0, 10 }

我想出了如何分组,但遗漏了一些问题。

sales.GroupBy(item => ((item.Item1.Date.Month - 1) / 3))
     .Select(x => new { Quarter = x.Key, Sum = x.Sum(item => item.Item2) })

一个solution非常好,但我无法管理它的情况

1 个答案:

答案 0 :(得分:1)

由于您的数据不一定包含所有季度,因此您应Post.joins(:user).where(users: { first_name: 'Mark' }) 将其存储到所有季度的集合中。要创建此类用途left join

Enumerable.Range

一些测试数据:

var groupedSales = sales.GroupBy(item => ((item.Date.Month - 1) / 3))
                        .Select(x => new { Quarter = x.Key, 
                                           Sum = x.Sum(item => item.Amount) });

var result = (from quarter in Enumerable.Range(0, 4)
              join sale in groupedSales on quarter equals sale.Quarter into grouping
              from sale in grouping.DefaultIfEmpty()
              select new { Quarter = quarter, Sum = sale?.Sum ?? 0 }).ToList();