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

C#比较DateTime键值字典获取医生可用预约时段的方法

实现逻辑

我们直接通过「时段重叠校验」逻辑完成筛选,步骤如下:

  1. 先过滤掉完全不在医生出诊时间范围内的无效预约记录,减少无效比对
  2. 遍历医生的每一段30分钟出诊时段,只要该时段和任意有效预约时段无重叠,就判定为空闲时段

时段是否重叠的判断规则:对两个半开区间[时段1开始, 时段1结束)和[时段2开始, 时段2结束),无重叠的条件为 时段1结束 <= 时段2开始 或 时段2结束 <= 时段1开始,反之则为重叠。

代码实现

补全后的GetAvailableSlots方法如下:

private Dictionary<DateTime, DateTime> GetAvailableSlots(DateTime studyDate, int? orgId)
{
    var doctorSlots = GetDoctorSlots();
    var scheduledSlots = GetScheduledSlots(studyDate, orgId);

    // 第一步:获取医生出诊的时间范围,过滤完全超出范围的无效预约
    var doctorMinStart = doctorSlots.Keys.Min();
    var doctorMaxEnd = doctorSlots.Values.Max();
    var validScheduledSlots = scheduledSlots
        .Where(s => s.Value > doctorMinStart && s.Key < doctorMaxEnd)
        .ToList();

    var availableSlots = new Dictionary<DateTime, DateTime>();
    // 第二步:逐个校验医生出诊时段是否被预约占用
    foreach (var doctorSlot in doctorSlots)
    {
        var slotStart = doctorSlot.Key;
        var slotEnd = doctorSlot.Value;
        // 判断当前时段是否和任意预约重叠
        bool isOccupied = validScheduledSlots.Any(scheduled => 
            !(slotEnd <= scheduled.Key || scheduled.Value <= slotStart)
        );
        // 没有重叠就加入可用时段
        if (!isOccupied)
        {
            availableSlots.Add(slotStart, slotEnd);
        }
    }

    return availableSlots;
}
注意事项
  • 请确保GetDoctorSlots生成的UTC时间,和GetScheduledSlots取出的预约时间时区一致,如果预约存储的是本地时间,需要统一转换为相同时区再比对,避免时区差导致判断错误
  • 上述逻辑支持覆盖多个30分钟时段的长预约场景,会自动过滤所有被覆盖的出诊时段
  • 如果单日预约量很大,可以基于已排序的预约列表用二分查找优化比对性能,常规场景下上述写法的性能完全够用
  • 原GetDoctorSlots方法中DateTime.UtcNow.Date.Date属于冗余写法,可简化为DateTime.UtcNow.Date

内容的提问来源于stack exchange,提问作者mnu-nasir

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 18:18:03