<分区>
Possible Duplicate:
Determine Whether Two Date Ranges Overlap
假设我有两个对象,每个对象都有一个介于其结束日期和开始日期之间的日期范围,我如何以最有效或最快的方式确定这两个日期范围之间是否存在任何重叠.
我想使用 .NET 3.5 c# 执行此操作
标签 c# .net-3.5 date-range
<分区>
Possible Duplicate:
Determine Whether Two Date Ranges Overlap
假设我有两个对象,每个对象都有一个介于其结束日期和开始日期之间的日期范围,我如何以最有效或最快的方式确定这两个日期范围之间是否存在任何重叠.
我想使用 .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 之后开始来提前移除了一半的问题空间。
关于c# - 如果我有两个时间段,我如何确定它们是否重叠?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3420527/