如何找到两组非连续时间的交集?

Chr*_*ayl 7 c# linq asp.net entity-framework

我正在尝试构建一个工具,根据员工安排工作的时间和请求时间来计算称为配额的内容.

我的ShiftSet对象是一组Shift对象,由StartTime和EndTime组成(两者都是time(7).每个ShiftSet对应一天.

ScheduleExceptions是员工关闭的时间.一天中可以有任意数量的重叠或不重叠的ScheduleExceptions.它们是日期时间数据类型.

ShiftSet的一个示例:
08:00-10:00
10:00-12:00
13:00-15:00
15:00-17:00

同一天的ScheduleExceptions示例:
07:30-10:30
14:35-16:00

我需要做的是找出员工一天工作的时间.我可以想象的方法是计算ShiftSet与ScheduleExceptions的反转的交集.

我该怎么做时间?如果可能的话,我更愿意使用Linq.

doc*_*ess 2

正如 InBetween 提到的,有一些库已经解决了这个问题,但它们也解决了许多相关问题。如果您只想解决这个特定问题而不采用其他依赖项,您可以尝试以下操作。

// Finds ones with absolutely no overlap
var unmodified = shifts.Where(s => !exceptions.Any(e => s.Start < e.End && s.End > e.Start));

// Finds ones entirely overlapped
var overlapped = shifts.Where(s => exceptions.Any(e => e.End >= s.End && e.Start <= s.Start));

// Adjusted shifts
var adjusted = shifts.Where(s => !unmodified.Contains(s) && !overlapped.Contains(s))
                        .Select(s => new Shift
                        {
                            Start = exceptions.Where(e => e.Start <= s.Start && e.End > s.Start).Any() ? exceptions.Where(e => e.Start <= s.Start && e.End > s.Start).First().End : s.Start,
                            End = exceptions.Where(e => e.Start < s.End && e.End >= s.End).Any() ? exceptions.Where(e => e.Start < s.End && e.End >= s.End).First().Start : s.End
                        });

var newShiftSet = unmodified.Union(overlapped).Union(adjusted);
Run Code Online (Sandbox Code Playgroud)

这是一个基本的示例,尽管它可以被压缩(尽管可读性较差)和改进。