重叠的多个日期范围比较:如何有效地进行?

要检查两个不同日期范围内的重叠, {Start1, End1}{Start2, End2}我正在检查:

 if ((Start1 = Start2)) { //overlap exists } 

问题是, 如果让我说五个日期范围,比较重叠的好方法什么?

检查它们中的任何一个是否相互重叠?

如果我有多个日期范围,如何查找这些范围是否重叠?

找出是否所有都重叠

 static bool Overlap(params Tuple[] ranges) { for (int i = 0; i < ranges.Length; i++) { for (int j = i + 1; j < ranges.Length; j++) { if (!(ranges[i].Item1 <= ranges[j].Item2 && ranges[i].Item2 >= ranges[j].Item1)) return false; } } return true; } 

找出是否有重叠

 static bool Overlap(params Tuple[] ranges) { for (int i = 0; i < ranges.Length; i++) { for (int j = i + 1; j < ranges.Length; j++) { if (ranges[i].Item1 <= ranges[j].Item2 && ranges[i].Item2 >= ranges[j].Item1) return true; } } return false; } 

如果我理解正确,你想回答这个问题:这些范围中是否有两个重叠? 根据它们的左端对它们进行排序,然后查看是否1重叠2,如果2重叠3等,如果有任何重叠,这将找到它。 我不相信有任何方法可以在没有至少O(n log n)时间的情况下回答任意间隔列表的问题,这就是排序它们会花费你的成本。

或者,也许您想回答这个问题:这些范围中是否有两个重叠? (从表面上看,这就是你编辑过的问题所要求的,但是(1)这似乎是一件奇怪的事情,并且(2)你上面的评论似乎表明它不是你的意思。)为了检查这一点,找到左边最右边的间隔和左边最右边的间隔,看它们是否重叠。 (如果你的两个间隔没有重叠,那么这两个不重叠。)

试试这个:

  private bool intersects(DateTime r1start, DateTime r1end, DateTime r2start, DateTime r2end) { return (r1start == r2start) || (r1start > r2start ? r1start <= r2end : r2start <= r1end); } 
  DateTime h1 = historyRecord.serviceStartDate; DateTime h2 = historyRecord.serviceEndDate; DateTime r1 = record.serviceStartDate; DateTime r2 = record.serviceEndDate; if (!((h1 > r1 && h1 > r2 && h2 > r1 && h2 > r2) || (h1 < r1 && h1 < r2 && h2 < r1 && h2 < r2))) { count += 1; } 

检查此算法以简要检测重叠周期 :

简单检查两个时间段是否重叠。

 bool overlap = a.start < b.end && b.start < a.end; 

或者在你的代码中......

 bool overlap = tStartA < tEndB && tStartB < tEndA;