您好我正在尝试按DateTime属性对对象集合进行分组,我遇到了一个奇怪的问题。目前我有以下内容:
TimeSpan interval = TimeSpan.FromMinutes(45);
var selected = from date in item.Dates
group date by (date.Ticks / interval.Ticks) into g
select g;
这基本上有效,但如果第一项的时间是11:45那么第一组只有15分钟长。接着是从12:00开始的下一组,并从那里正确分组。我错过了一些非常简单的事情,还是我需要改变我尝试分组的方式?我真正想做的是将我的所有对象分成45分钟的块。
答案 0 :(得分:2)
您只需要在分组前抵消所有日期。
TimeSpan offset = startTime.TimeOfDay;
TimeSpan interval = TimeSpan.FromMinutes(45);
var selected = from date in item.Dates
group date by ((date.Ticks - offset.Ticks) / interval.Ticks) into g
select g;
答案 1 :(得分:1)
这里的问题是你已经在"时间组轴"中定义了单位。 (45分钟),但您没有明确定义轴的起始位置。
当前代码分组将从00:00开始,因此每次最终到达11:15(这是11:15-12:00组的开始)时添加45分钟。实际进入该组的第一个事件的时间不起作用。
如果您想要从第一个事件发生的确切时间开始的45分钟组补偿:
// In your current version this is effectively TimeSpan.Zero
var startOfAxis = item.Dates.Min().TimeOfDay;
var interval = TimeSpan.FromMinutes(45);
var selected =
from date in item.Dates
group date by ((date.Ticks - startOfAxis.Ticks) / interval.Ticks) into g
select g;