从日期列表中返回相交日期范围
问题描述:
我有一个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库的时间段,但这只告诉我存在交集,而不是交集的范围。
只是要清楚,我不想知道是否存在交叉点或重叠,我需要知道它们出现的范围。
答
这为我工作:
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
});
它给了我:
+1
完美的答案,你已经保存了我的培根,非常感谢Enigmativity。甚至没有考虑过聚合函数。这种简单优雅的解决方案 – StuartM
最好的办法是通过起始日期进行排序。你应该检查什么时候没有人工作,哪一个是行(x-1)EndDate
jdweng