2013-08-06 151 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;