3

您好我正在尝试按其 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 分钟的块。

4

2 回答 2

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;
于 2013-08-06T13:18:24.600 回答
1

这里的问题是您已经在“时间组轴”(45 分钟)中定义了单位,但您没有明确定义轴的开始位置。

当前代码分组将从 00:00 开始,因此每次添加 45 分钟,最终到达 11:15,即 11:15-12:00 组的开始。实际进入该组的第一个事件的时间不起作用。

如果您想要从第一个事件发生的确切时间开始的 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;
于 2013-08-06T13:23:41.103 回答