2017-07-18 118 views
0

我有一個Calendar對象列表,其中包含ParentId,StartDate和EndDate,它們表示工作班次中斷。任何時候都可以在一個地區進行多次輪班,每個輪班都有不同的休息時間。從日期列表中返回相交日期範圍

我需要能夠得到它們相交的日期範圍,以便我可以確定當前沒有人在哪個區域工作。

舉例來說,如果我有以下轉變遊:

new Calendar { ParentId = 1, StartDate = 2017-06-18 11:50:00, EndDate = 2017-06-18 12:20:00 }; 
new Calendar { ParentId = 2, StartDate = 2017-06-18 12:10:00, EndDate = 2017-06-18 12:40:00 };  
new Calendar { ParentId = 3, StartDate = 2017-06-18 12:15:00, EndDate = 2017-06-18 12:45:00 }; 

然後交集時間我需要返回是12時15分零零秒 - 12:20:00因爲這是唯一的一次是,地區沒有人在場。

我已經嘗試了.NET庫的時間段,但這隻告訴我存在交集,而不是交集的範圍。

只是要清楚,我不想知道是否存在交叉點或重疊,我需要知道它們出現的範圍。

enter image description here

+0

最好的辦法是通過起始日期進行排序。你應該檢查什麼時候沒有人工作,哪一個是行(x-1)EndDate jdweng

回答

0

這爲我工作:

var cals = new [] 
{ 
    new { ParentId = 1, StartDate = DateTime.Parse("2017-06-18 11:50:00"), EndDate = DateTime.Parse("2017-06-18 12:20:00") }, 
    new { ParentId = 2, StartDate = DateTime.Parse("2017-06-18 12:10:00"), EndDate = DateTime.Parse("2017-06-18 12:40:00") }, 
    new { ParentId = 3, StartDate = DateTime.Parse("2017-06-18 12:15:00"), EndDate = DateTime.Parse("2017-06-18 12:45:00") }, 
}; 

var intersection = 
    cals 
     .Aggregate((c0, c1) => new 
     { 
      ParentId = -1, 
      StartDate = c0.StartDate > c1.StartDate ? c0.StartDate : c1.StartDate, 
      EndDate = c0.EndDate < c1.EndDate ? c0.EndDate : c1.EndDate 
     }); 

它給了我:

intersection

+1

完美的答案,你已經保存了我的培根,非常感謝Enigmativity。甚至沒有考慮過聚合函數。這種簡單優雅的解決方案 – StuartM