关于c#:如果我有两个时间段,我怎么知道它们是否重叠?

If I have two time periods, how do I find out if they overlap?

本问题已经有最佳答案,请猛点这里访问。

0

假设我有两个对象,并且每个对象都有一个介于结束日期和开始日期之间的日期范围,那么如何以最有效或最快的方式来确定两个日期范围之间是否有重叠。

我想用.NET 3.5 C来做这个#


不管这是最有效的还是最快的,我都不确定,但这就是我要做的。如果结果是一个瓶颈,那么只有到那时,我才会进一步优化:

如果需要,您可以通过交换范围来确保第一个范围更早(或同时)开始。

然后,如果另一个范围开始小于或等于第一个范围结束(如果范围包括开始时间和结束时间),或者小于(如果范围包括开始时间和结束时间),则可以检测重叠。

假设两端都包含,则只有四种可能性,其中一种是不重叠的:

1
2
3
4
5
|----------------------|        range 1
|--->                           range 2 overlap
 |--->                          range 2 overlap
                       |--->    range 2 overlap
                        |--->   range 2 no overlap

范围2的端点未进入该范围。所以,在伪代码中:

1
2
3
4
5
6
def doesOverlap (r1,r2):
    if r1.s > r2.s:
        swap r1, r2
    if r2.s > r1.e:
        return false
    return true

如果范围在开始时是包含的,在结束时是独占的,您只需在第二个if语句中用>=替换>

2

您极大地限制了必须进行的检查的数量,因为通过确保范围1从不在范围2之后开始,您可以提前删除一半的问题空间。


检查第二个对象的开始日期或结束日期是否在第一个对象的范围内:

bool overlap = (y.Start > x.Start && y.Start < x.End) || (y.End > x.Start && y.End < x.End);