You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:18:15