首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检测重叠周期的算法

问检测重叠周期的算法
EN

Stack Overflow用户
提问于 2012-11-22 13:39:29
回答 12查看 204.8K关注 0票数 557

我得检测两个时间段是否重叠。

每个句号都有一个开始日期和一个结束日期。

我需要检测我的第一个时间段(A)是否与另一个时间段(B/C)重叠。

在我的例子中,如果B的开头等于A的结尾,则它们不是重叠的(反之亦然)

我发现了以下情况:

​

​

所以实际上我是这样做的

代码语言:javascript
复制
tStartA < tStartB && tStartB < tEndA //For case 1
OR
tStartA < tEndB && tEndB <= tEndA //For case 2
OR
tStartB < tStartA  && tEndB > tEndA //For case 3

(个案4记在个案1或个案2的账目内)

它是工作的,但它似乎效率不高。

因此,首先,c#中有一个现有的类可以对这个(时间段)建模,类似于timespan,但是有一个固定的开始日期。

第二:是否已经有能够处理此问题的c#代码(如DateTime类中的代码)?

第三:如果不是,你会用什么方法来使这个比较最快速?

EN

回答 12

Stack Overflow用户

回答已采纳

发布于 2012-11-22 13:41:21

简单地检查两个时间段是否重叠:

代码语言:javascript
复制
bool overlap = a.start < b.end && b.start < a.end;

或者在你的代码中:

代码语言:javascript
复制
bool overlap = tStartA < tEndB && tStartB < tEndA;

(如果您改变主意,想要说两个只会相互接触的句点,那么请使用<=而不是<。)

票数 954
EN

Stack Overflow用户

发布于 2012-11-22 13:46:17

有一个很棒的库,它对CodeProject:http://www.codeproject.com/Articles/168662/Time-Period-Library-for-NET有很好的评论

这个库在重叠、交叉等方面做了很多工作。它太大了,无法全部复制/粘贴,但是我会看看哪些特定的部分对你有用。

票数 49
EN

Stack Overflow用户

发布于 2012-11-22 13:50:58

您可以创建一个可重用的范围模式类:

代码语言:javascript
复制
public class Range<T> where T : IComparable
{
    readonly T min;
    readonly T max;

    public Range(T min, T max)
    {
        this.min = min;
        this.max = max;
    }

    public bool IsOverlapped(Range<T> other)
    {
        return Min.CompareTo(other.Max) < 0 && other.Min.CompareTo(Max) < 0;
    }

    public T Min { get { return min; } }
    public T Max { get { return max; } }
}

您可以添加所有需要合并范围、获取交叉点等的方法.

票数 24
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13513932

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档