假设我有两个对象,并且每个对象的日期范围都在其结束日期和开始日期之间,如何以最有效或最快的方式确定两个日期范围之间是否有任何重叠
我想使用.NET 3.5 c#
执行此操作答案 0 :(得分:1)
这是最有效还是最快,我不确定,但这就是我要做的。如果它被证明是一个瓶颈,那么我才会进一步优化:
如果需要,您可以通过交换范围来确保第一个范围更早(或同时)开始。
然后,如果其他范围开始小于或等于第一个范围结束(如果范围包含,包含开始和结束时间)或小于(如果范围包括开始和排除),则可以检测重叠结束)。
假设两端都是包容性的,那么只有四种可能性,其中一种是不重叠的:
|----------------------| 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之后永远不会开始,您可以提前删除一半的问题空间。
答案 1 :(得分:-4)
检查第二个对象的Startdate或Enddate是否在第一个对象的范围内:
bool overlap = (y.Start > x.Start && y.Start < x.End) || (y.End > x.Start && y.End < x.End);