我有由日期和总数组成的数据。我需要按季度计算销售总额。输出按季度返回销售总额数组,结果为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是不错的,但我不能处理好我的情况
发布于 2016-08-30 20:11:44
因为您的数据不一定包含所有季度,所以您应该将其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 },
};https://stackoverflow.com/questions/39235701
复制相似问题