从日期列表中返回相交日期范围

问题描述:

我有一个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

这为我工作:

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