2013-08-06 4 views
3

안녕하세요, DateTime 속성으로 개체 컬렉션을 그룹화 할 시도하고있어 이상한 문제가 있습니다. 현재 나는 다음과 같습니다임의의 시간 간격으로 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시에 시작하여 거기에서 올바르게 그룹화됩니다. 정말 간단한 것을 놓치고 있습니까, 아니면 그룹화하려는 방식을 바꾸어야합니까? 제가 정말로하려는 것은 모든 객체를 45 분짜리 덩어리로 그룹화하는 것입니다.

+0

[임의의 시간 간격에 의해 그룹 날짜 시간]의 중복 가능성 (http://stackoverflow.com/questions/3559302/group-datetime-by-any-time-interval) – Artless

+0

그 질문은 'date by Ticks/interval.Ticks by g select g'부분을 찾은 곳입니다. 첫 번째 그룹이 올바른 길이가 아닌 이유를 찾고 있습니다. – 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에 도달 할 때마다 45 분이 추가되어 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; 
관련 문제