首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c# linq扩展组并按季度选择数据,其中缺少月份

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

Stack Overflow用户
提问于 2016-08-30 19:32:50
回答 1查看 1.1K关注 0票数 1

我有由日期和总数组成的数据。我需要按季度计算销售总额。输出按季度返回销售总额数组,结果为Q1的销售和,结果1为Q2的销售和等等。

例如,输入'sales':

代码语言:javascript
复制
/// {} => { 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 }

我想出了如何分组的办法,但对失踪的宿舍有个问题。

代码语言:javascript
复制
sales.GroupBy(item => ((item.Item1.Date.Month - 1) / 3))
     .Select(x => new { Quarter = x.Key, Sum = x.Sum(item => item.Item2) })

一个solution是不错的,但我不能处理好我的情况

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-30 20:11:44

因为您的数据不一定包含所有季度,所以您应该将其left join到所有季度的集合中。要创建这样的使用Enumerable.Range

代码语言:javascript
复制
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();

一些测试数据:

代码语言:javascript
复制
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 },
};
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39235701

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档