【发布时间】:2010-11-22 13:30:00
【问题描述】:
我有以下 Linq 按年分组列表,然后按月。
var changesPerYearAndMonth = list
.GroupBy(revision => new { revision.LocalTimeStamp.Year, revision.LocalTimeStamp.Month })
.Select(group => new { GroupCriteria = group.Key, Count = group.Count() })
.OrderBy(x => x.GroupCriteria.Year)
.ThenBy(x => x.GroupCriteria.Month);
我目前的输出如下:
Year 2005, month 1, count 469
Year 2005, month 5, count 487
Year 2005, month 9, count 452
Year 2006, month 1, count 412
Year 2006, month 5, count 470
...
如您所见,没有价值的月份不包括在查询中。我想包括它们,具有以下输出:
Year 2005, month 1, count 469
Year 2005, month 2, count 0
Year 2005, month 3, count 0
...
Year 2005, month 12, count 0
Year 2006, month 1, count 412
Year 2006, month 2, count 0
...
Year 2006, month 12, count 0
换句话说,我也需要得到空月。
我可以用 Linq 查询来实现吗?提前致谢
【问题讨论】:
-
当我们可以在一个循环中更简单、更易读的时候,为什么还要花这么多时间来设计一个困难、不可读和低效的 Linq?
-
@Aliostad:到目前为止,Daniel 的 Linq 解决方案非常简单易读。如果这个问题的答案使用 Linq 太复杂,他总是可以退回到使用循环。
-
好吧,我只是认为我们处于一个不正常的 Linq-mad 世界。你失去了所有的调试能力。关键是,类似于 XSLT,如果它变得太复杂,它就是纸牌屋。
-
像这样使用
OrderBy两次是个坏主意。你应该使用OrderBy(x => x.GroupCriteria.Year).ThenBy(x => x.GroupCriteria.Month)。这是一个附带问题(这就是为什么我没有将其作为答案发布的原因)但它仍然值得了解。 -
@Aliostad:我不使用 linq,因为它是一个很好的练习……这就是原因,在我们的实验室中进行了测试。四百万个对象:用户使用 LINQ 获取修订计数:0 毫秒。通过用户迭代方法获取修订计数:780ms