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/

相关文章:

c# - ASP.NET Core 3.1 InProcess 托管应用程序在启动异常后未重新启动

c# - 有没有办法用.Net 3.5在WPF中模拟UseLayoutRounding

mysql - 使用 mysql 按数据导入日期按日期在现有数据集中查找唯一/新值

javascript - JavaScript 的日期范围限制

c# - 使用 ref - 良好的编程实践与否

c# - 使用 HttpClient 保留转义的 Uri

c# - 使用 LINQ 在运行时从数据库中获取数据

WPF:按下鼠标左键时 PreviewMouseMove 不会触发?

c# - 通过名称获取类成员

elasticsearch - 如何使用 Elasticsearch 过滤最后 5 分钟的日期直方图?