2011-08-24 117 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 
    }; 
相關問題