LINQ DateTime 聚合与 GroupBy 和 Group By



我有一个时间间隔数据列表,相隔 30 分钟,如下所示:

List<TimeInterval> testData = new List<TimeInterval>();
testData.Add(new TimeInterval() { Start = DateTime.Parse("2012-05-09 6:00:00 AM"), End = DateTime.Parse("2012-05-09 6:30:00 AM"), Value = 1 });
testData.Add(new TimeInterval() { Start = DateTime.Parse("2012-05-09 6:30:00 AM"), End = DateTime.Parse("2012-05-09 7:00:00 AM"), Value = 1 });
testData.Add(new TimeInterval() { Start = DateTime.Parse("2012-05-09 7:00:00 AM"), End = DateTime.Parse("2012-05-09 7:30:00 AM"), Value = 1 });
testData.Add(new TimeInterval() { Start = DateTime.Parse("2012-05-09 7:30:00 AM"), End = DateTime.Parse("2012-05-09 8:00:00 AM"), Value = 1 });
.....
testData.Add(new TimeInterval() { Start = DateTime.Parse("2012-05-10 7:00:00 AM"), End = DateTime.Parse("2012-05-10 7:30:00 AM"), Value = 20 });
testData.Add(new TimeInterval() { Start = DateTime.Parse("2012-05-10 7:30:00 AM"), End = DateTime.Parse("2012-05-10 8:00:00 AM"), Value = 10 });
................... up to N number of N number of years.

public class TimeInterval
    {
       public DateTime Start { get; set; }
       public DateTime End { get; set; }
       public decimal Value { get; set; }
    }

有人可以建议将上述数据汇总到的最佳方法吗:

  1. 小时

我在这里尝试了建议的解决方案,但似乎都没有满足上述要求。感谢您的帮助。

对于上面给出的示例,小时的期望结果是:

Lists Of:
TimeInterval() { Start = DateTime.Parse("2012-05-09 6:00:00 AM"), End = DateTime.Parse("2012-05-09 7:00:00 AM"), Value = 2 }
TimeInterval() { Start = DateTime.Parse("2012-05-09 7:00:00 AM"), End = DateTime.Parse("2012-05-09 8:00:00 AM"), Value = 2 }
...
TimeInterval() { Start = DateTime.Parse("2012-05-10 7:00:00 AM"), End = DateTime.Parse("2012-05-10 8:00:00 AM"), Value = 2 }

对于天,它将是当天的总和。对于一周,它将是整周的总计,依此类推基本上是给定聚合类型的值总和。

List<Interval> CreatHourIntervals(DateTime start, int count, int intervalValue, int val)
{
    return     Enumerable.Range(0,count)
               .Select(x=> new Interval
                               {
                                 StartDate = start.AddHours(x*intervalValue), 
                                 EndDate = start.AddHours((x + 1)*intervalValue),
                                 value = val
                               }
                         ).ToList(); 
}

描述

开始

是间隔中第一项的开始日期。

计数:是所需的间隔数。

intervalValue:是间隔之间的差异,例如在小时的情况下,它可以在 1,12 之间变化(也可以是小数)。 例如,如果将其设置为 2 ,则每个间隔长度为 2 小时。

对于其他类型,您可以自己编写相关方法。