我的对象中存储了一个日期集合。这是示例数据。在真实的情况下,这些日期将来自服务调用,我不知道返回的是什么日期和多少日期:
var ListHeader = new List<ListHeaderData>
{
new ListHeaderData
{
EntryDate = new DateTime(2013, 8, 26)
},
new ListHeaderData
{
EntryDate = new DateTime(2013, 9, 11)
},
new ListHeaderData
{
EntryDate = new DateTime(2013, 1, 1)
},
new ListHeaderData
{
EntryDate = new DateTime(2013, 9, 15)
},
new ListHeaderData
{
EntryDate = new DateTime(2013, 9, 17)
},
new ListHeaderData
{
EntryDate = new DateTime(2013, 9, 5)
},
};
我现在需要按日期范围分组,如下所示:
Today (1) <- contains the date 9/17/2013 and count of 1
within 2 weeks (3) <- contains dates 9/15,9/11,9/5 and count of 3
More than 2 weeks (2) <- contains dates 8/26, 1/1 and count of 2
这是我的LINQ语句,它没有达到我所需要的,但我认为我在大概范围内(如果我不是的话,请友好):
var defaultGroups = from l in ListHeader
group l by l.EntryDate into g
orderby g.Min(x => x.EntryDate)
select new { GroupBy = g };
这是按单个日期分组的,所以我有6个组,每个组中有1个日期。我如何按日期范围分组,在每个组中计数和排序?
4条答案
按热度按时间sxpgvts31#
引入数组,其中包含要作为分组依据的范围。下面是两个范围-今天(零天)和14天(两周):
现在按项目福尔斯的范围对项目进行分组。如果没有合适的范围(所有日期都超过两周),则使用默认的
null
范围值:UPDATE:新增群组的自订范围:
vs3odd8k2#
这样如何?
为分组引入一个新属性,并按该属性分组。
编辑:正如@servy在评论中指出的那样,其他开发人员可能会混淆
int
,使用enum
会更具可读性。因此,修改后的类将如下所示
像这样使用
blmhpbnm3#
您是否特别希望以这种方式实现解决方案?您是否真的希望在类中引入伪属性来满足这些要求?
这三条线可以满足您的要求,对于大型集合,性能会更好。
你还可以灵活地进行不同的分组而不影响你的类。
[编辑:响应订购查询]
利用上面提供的Enum,您可以应用Union子句和OrderBy子句Linq扩展方法,如下所示:
请注意,我通过Linq Select和匿名类添加了Grouping,以再次动态推送Group属性,而不影响原始类。
并使用count获取分组的日期范围:
输出为:
93ze6v8z4#
我想这取决于你计划使用它的程度。我有/有很多报告要生成,所以我用
StartTime
,EndTime
和TimeIncrement
作为枚举创建了一个模型IncrementDateRange
。时间增量处理程序有很多基于开关的函数,基于小时/天/周/月/季度/年等,在开始和结束范围之间吐出一个时间列表。
然后你得到
IncrementDateRange
的列表,在linq中类似于:或