2010-08-24 205 views
7

任意時間我有一個這樣定義的項目類的IEnumerable:組日期時間通過間隔

public class Item { 
    public DateTime Date { get; private set; } 
    public decimal? Value { get; private set; } 

    public Item(DateTime date, decimal? value) { 
    Date = date; 
    Value = value; 
    } 
} 

這些項目是在一個特定的時間間隔(5分鐘爲例)。我需要按日期分組,但改變時間間隔。例如,如果該項目是按以下順序:

2010-08-24 00:05 
2010-08-24 00:10 
2010-08-24 00:15 
2010-08-24 00:20 
2010-08-24 00:25 
2010-08-24 00:30 

,我想它們分成15分鐘車間隔,結果應該是這樣的:

2010-08-24 00:15 
2010-08-24 00:30 

間隔由提供另一個類,但我可以獲得表示該間隔的毫秒(例如,Interval.FromMinutes(5).GetMilliseconds()應返回300000)。問題是我該如何編寫一個分組函數,它允許我做這樣的事情:data = items.GroupBy(t => GroupingFunction(t.DateTime, interval))並獲得結果?

更新:間隔將不一定在幾分鐘內。它可能在幾小時,幾分鐘甚至幾天。

+0

你想分組或過濾(如你的例子)? – 2010-08-24 17:48:59

+0

分組。在例子00:05,00:10和00:15變成00:15(我將三個項目的值相加並保留00:15時間戳)。 – Fernando 2010-08-24 17:53:01

回答

7

這樣的事情?

 DateTime[] dateTimes = new[] 
            { 
             new DateTime(2010, 8, 24, 0, 5, 0), 
             new DateTime(2010, 8, 24, 0, 10, 0), 
             new DateTime(2010, 8, 24, 0, 15, 0), 
             new DateTime(2010, 8, 24, 0, 20, 0), 
             new DateTime(2010, 8, 24, 0, 25, 0), 
             new DateTime(2010, 8, 24, 0, 30, 0) 
            }; 
     TimeSpan interval = new TimeSpan(0, 15, 0);  // 15 minutes. 

     var groupedTimes = from dt in dateTimes 
          group dt by dt.Ticks/interval.Ticks 
          into g 
          select new {Begin = new DateTime(g.Key*interval.Ticks), Values = g.ToList()}; 

     foreach (var value in groupedTimes) 
     { 
      Console.WriteLine(value.Begin); 
      Console.WriteLine("\t{0}", String.Join(", ", value.Values)); 
     } 
0

您是否嘗試過使用模數進行分組?

未經測試流的意識僞代碼如下:

data = items.GroupBy(t => t.TimeInterval % 15 == 0); 
1
data = items.GroupBy(t => (int)(t.DateTime.Minutes/interval))) 
+0

只有間隔小於60分鐘時,這纔會起作用。 – driis 2010-08-24 18:05:01