2010-08-24 176 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