c# linq extension Group 和 select 季度数据,其中缺少月份

c# linq extension Group and select data by quarter with missing months inside

我有包含日期​​和总和的数据。 我需要按季度计算销售额。 按季度输出 returns 销售总额数组, 结果[0] 是第一季度的销售额,结果1 是第二季度的销售额等

例如输入'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 很好,但我的情况无法做到

因为您的数据不一定包含所有季度,所以您应该 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();

部分测试数据:

List<dynamic> sales = new List<dynamic>
{
   new { Date = new DateTime(2010,1,1), Amount = 10 },
   new { Date = new DateTime(2010,2,2), Amount = 10 },
   new { Date = new DateTime(2010,3,3), Amount = 10 },
   new { Date = new DateTime(2010,4,4), Amount = 10 },
   new { Date = new DateTime(2010,5,5), Amount = 10 },
   new { Date = new DateTime(2010,6,6), Amount = 10 },
};