可能重复:
确定两个日期范围是否重叠
假设我有两个对象,并且每个对象都有一个介于其结束日期和开始日期之间的日期范围,我如何以最有效或最快的方式确定两个日期范围之间是否有任何重叠。
我想使用 .NET 3.5 c# 来做到这一点
可能重复:
确定两个日期范围是否重叠
假设我有两个对象,并且每个对象都有一个介于其结束日期和开始日期之间的日期范围,我如何以最有效或最快的方式确定两个日期范围之间是否有任何重叠。
我想使用 .NET 3.5 c# 来做到这一点
这是否是最有效或最快的,我不确定,但我会这样做。如果它被证明是一个瓶颈,那么只有到那时我才会考虑进一步优化:
您可以通过在必要时交换范围来确保第一个范围更早(或同时)开始。
然后,如果另一个范围开始小于或等于第一个范围结束(如果包括范围,则包含开始和结束时间)或小于(如果范围包括开始但不包括结束),则可以检测重叠.
假设两端都包含,只有四种可能性,其中一种是不重叠的:
|----------------------| range 1
|---> range 2 overlap
|---> range 2 overlap
|---> range 2 overlap
|---> range 2 no overlap
范围 2 的端点不进入其中。所以,在伪代码中:
def doesOverlap (r1,r2):
if r1.s > r2.s:
swap r1, r2
if r2.s > r1.e:
return false
return true
如果范围在开始时包含且在末尾不包含,则只需在第二个语句中替换>
为:>=
if
|----------------------| range 1
|---> range 2 overlap
|---> range 2 overlap
|---> range 2 no overlap
|---> range 2 no overlap
您大大限制了您必须进行的检查次数,因为您通过确保范围 1 永远不会在范围 2 之后开始,提前删除了一半的问题空间。
检查第二个对象的开始日期或结束日期是否在第一个对象的范围内:
bool overlap = (y.Start > x.Start && y.Start < x.End) || (y.End > x.Start && y.End < x.End);