2011-08-24 82 views
2

我有日期的集合:按季度统计日期的最佳方法是什么?

IEnumerable<DateTime> Events; 

而且我想算和铲斗再进宿舍(2011年第一季度,2011年第二季度,等等),其中每个季度代表三个月桶。

我开始用一个循环和一个单独的字典“手动”执行此操作,但我认为使用LINQ等进行此转换可能更优雅。

我想用一个数据结构,看起来像这样结束了:

public List<QuarterInfo> QuarterBreakdown 

其中QuarterInfo很简单:

public class QuarterInfo 
{ 
    public int QuarterOfYear; //1, 2, 3 or 4 
    public int Year; 
    public IEnumerable<DateTime> Events; 
} 

注意的是,以上是我的想法,但我比接受有关实现此目的其他方式的建议。

回答

5

纯LINQ,使用GroupBy

var result = Events 
    .Select(d => new { DateTime = d, Q = (d.Month - 1)/3 }) 
    .GroupBy(a => new { a.Q, a.DateTime.Year }) 
    .Select(a => new QuarterInfo 
     { 
      Events = a.Select(s => s.DateTime), 
      QuarterOfYear = a.Key.Q + 1 
     }); 
+0

这个答案似乎并不在多年的事件因素。他们应该进入单独的桶。 2010年1月的事件不应该和2011年1月一样。 – leora

+0

@ooo,你说得对。固定。 –

+0

我认为d.Month/3是不正确的,因为我看到9月日期进入Q = 4,12月日期进入Q = 5。我认为这可能是一个分裂问题 – leora

1
var QuarterBreakdown = 
    from date in Events 
    group date by date.Year * 4 + (date.Month - 1)/3 into quarters 
    select new QuarterInfo 
    { 
     Events = quarters, 
     Year = quarters.Key/4, 
     QuarterOfYear = quarters.Key % 4 + 1 
    }; 
相关问题