一种不同的方法,我不确定整个事情的性能,但其想法是在一个 BitArray 中展平您的日程定义的范围,该 BitArray 表示特定分钟是否已被先前的日程使用。
从技术上讲,它也不是一个“单行”的答案,尽管从调用代码的角度来看它只是一行
所以假设已经定义了一个类ScheduleList
public class ScheduleList : List<Schedule>
{
private BitArray ba = new BitArray(1440);
// Define own Add method to Add a Schedule to the list
// Or override the predefined one....
public Schedule Add(int sh, int sm, int eh, int em)
{
Schedule s = new Schedule();
s.StartTime = new DateTime(1, 1, 1, sh, sm, 0);
s.EndTime = new DateTime(1, 1, 1, eh, em, 0);
// Of course, having full control on the Add phase, you
// could easily enforce your policy at this point.
// You could not accept a new schedule if the time slot is busy
// but we could ignore it at this point
this.Add(s);
return s;
}
public bool IsTimeSlotBusy(Schedule s)
{
int sidx = Convert.ToInt32(TimeSpan.FromMinutes((s.StartTime.Hour * 60) + s.StartTime.Minute).TotalMinutes);
int eidx = Convert.ToInt32(TimeSpan.FromMinutes((s.EndTime.Hour * 60) + s.EndTime.Minute).TotalMinutes);
for (int x = sidx; x <= eidx; x++)
{
if (ba.Get(x)) return true;
ba.Set(x, true);
}
return false;
}
}
现在你可以写这样的东西了
ScheduleList schedules = new ScheduleList();
schedules.Add(12, 0, 12, 30);
schedules.Add(15, 10, 15, 30);
schedules.Add(12, 0, 23, 59);
schedules.Add(14, 0, 23, 59);
// The fake 'one liner'
bool overlap = schedules.Any(s => schedules.IsTimeSlotBusy(s));
Console.WriteLine(overlap);
在这里等待数学家告诉我为什么这是最糟糕的。 (不讽刺,我真的很想知道从数学的角度来看这是否不好)