c# linq扩展组和按季度选择数据,其中缺少月份

本文关键字:数据 选择 扩展 linq 季度 | 更新日期: 2023-09-27 18:05:02

我有由日期和总和组成的数据。我需要按季度计算销售额。输出返回按季度的销售总额数组,result[0]为Q1的销售总额,result1为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) })

一个解决方案是很好的,但我不能管理我的情况

c# linq扩展组和按季度选择数据,其中缺少月份

因为您的数据不一定具有所有的四分之一,您应该将其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 },
};