我有一个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 :(得分:11)
这样的东西?
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));
}
答案 1 :(得分:3)
data = items.GroupBy(t => (int)(t.DateTime.Minutes/interval)))
答案 2 :(得分:0)
您是否尝试按模数进行分组?
未经测试的意识流伪代码如下:
data = items.GroupBy(t => t.TimeInterval % 15 == 0);