Группировать DateTime по произвольному временному интервалу

у меня есть 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 минутах для exemple). Мне нужно сгруппировать их по дате, но изменить интервал. Например, если элементы расположены в следующем порядке:

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.Вызываем(5).GetMilliseconds () должен возвращать 300000). Вопрос как я могу написать функцию группирования, которая позволяет мне делать что-то вроде этого : data = items.GroupBy(t => GroupingFunction(t.DateTime, interval)) и получаем такой результат?

обновление: интервал не обязательно будет в минутах. Это может занять часы, минуты или даже дни.

3 ответов


что-то вроде этого ?

        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));
        }

 data = items.GroupBy(t => (int)(t.DateTime.Minutes/interval)))

вы пробовали группировать по модулю?

непроверенный псевдокод потока сознания следует:

data = items.GroupBy(t => t.TimeInterval % 15 == 0);