LINQ DateTime与GroupBy和Group By的聚合

时间:2012-05-09 06:01:54

标签: c# linq datetime linq-to-objects

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

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. 小时
  2.   
  3.   
  4.   
  5.   
  6.   

我尝试了建议的解决方案here,但似乎没有一个能满足上述要求。谢谢你的帮助。

上述给定示例的小时的预期结果是:

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 }

对于Days,它将是当天的总数。 对于一周,它将是一整周的总数等。基本上总和给定聚合类型的值。

1 个答案:

答案 0 :(得分:1)

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

<强>描述

开始:是区间中第一个项目的开始日期。

count:是您想要的间隔数。

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

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