C#实现CRUD页面中三个及以上时间范围的重叠判断问题
解决多时间范围重叠判断的问题
嘿,我明白你现在卡在扩展多时间范围重叠判断的需求上了!你的现有思路其实已经踩中了核心——先按开始时间排序,再检查相邻时间范围,这个逻辑完全可以无缝扩展到三个及以上的时间段,而且效率还很高。
核心逻辑说明
当你把所有时间段按开始时间从小到大排序后,只要任意一组相邻的时间段存在重叠,那么整个集合就存在时间冲突。反过来,如果所有相邻时间段都不重叠,那整个集合里的时间段肯定都是互不干扰的。这个逻辑对任意数量的时间段都成立,不用去做低效的两两对比(那种方法复杂度是O(n²),数据多了会很慢)。
完整优化后的代码
public static bool IsOverLapping(ConfigureViewModel viewModel) { // 先处理空集合或者只有一个时间段的情况,直接返回无重叠 if (viewModel.Periods == null || viewModel.Periods.Count <= 1) return false; // 按开始时间的TimeOfDay排序(如果是跨天的时间段,建议用完整DateTime而不是TimeOfDay) var sortedPeriods = viewModel.Periods .OrderBy(x => x.StartTime.TimeOfDay) .ToList(); // 遍历相邻的时间段对 for (var i = 0; i < sortedPeriods.Count - 1; i++) { var currentPeriod = sortedPeriods[i]; var nextPeriod = sortedPeriods[i + 1]; // 判断重叠:当前时间段的结束时间 > 下一个时间段的开始时间 // 注意:如果允许首尾相接(比如10:00结束和10:00开始不算重叠),就用 >;如果算重叠就用 >= if (currentPeriod.EndTime.TimeOfDay > nextPeriod.StartTime.TimeOfDay) { return true; // 找到重叠,直接返回true } } // 所有相邻都不重叠,返回false return false; }
关键细节提示
- 边界条件处理:我加了对空集合或单个时间段的判断,避免不必要的遍历。
- 排序的重要性:必须先排序,否则相邻检查的逻辑不成立。如果你的时间段是跨天的(比如当天23:00到次日1:00),那不能只用
TimeOfDay,得用完整的DateTime对象来排序和判断。 - 重叠的定义:你可以根据业务需求调整判断条件——比如如果两个时间段刚好首尾相接(A结束于10:00,B开始于10:00),算不算重叠?把
>改成>=就可以把这种情况算进去。
为什么这个方法高效?
排序的时间复杂度是O(n log n),遍历是O(n),整体比两两对比的O(n²)高效太多,尤其是当时间段数量较多的时候(比如排班系统里的几十个班次)。
内容的提问来源于stack exchange,提问作者Josh Fletcher
相关产品推荐
相关产品推荐

