2013-08-06 152 views
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分钟的块。

+0

[按任意的时间间隔组的DateTime]的可能重复(http://stackoverflow.com/questions/3559302/group-datetime-by-one-any-time-interval) – Artless

+0

这个问题是我在其中找到'group date by(date.Ticks/interval.Ticks into g select g'part of my query。寻找一个原因,为什么第一组不会是正确的长度。 – ThomasG

回答

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; 
+0

ofc'startTime'必须是'item.Dates.Min()'。 – MarcinJuraszek

+0

@MarcinJuraszek这是意图,随时编辑我的答案。 –

+1

谢谢。它的工作少了一点头痛。 – ThomasG

1

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

由于当前的代码分组将在00:00开始,因此每次最终到达11:15(这是11:15-12:00组的开始时间)的11:15时加上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;