我得检测两个时间段是否重叠。
每个句号都有一个开始日期和一个结束日期。
我需要检测我的第一个时间段(A)是否与另一个时间段(B/C)重叠。
在我的例子中,如果B的开头等于A的结尾,则它们不是重叠的(反之亦然)
我发现了以下情况:

所以实际上我是这样做的
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类中的代码)?
第三:如果不是,你会用什么方法来使这个比较最快速?
发布于 2012-11-22 13:41:21
简单地检查两个时间段是否重叠:
bool overlap = a.start < b.end && b.start < a.end;或者在你的代码中:
bool overlap = tStartA < tEndB && tStartB < tEndA;(如果您改变主意,想要说两个只会相互接触的句点,那么请使用<=而不是<。)
发布于 2012-11-22 13:46:17
有一个很棒的库,它对CodeProject:http://www.codeproject.com/Articles/168662/Time-Period-Library-for-NET有很好的评论
这个库在重叠、交叉等方面做了很多工作。它太大了,无法全部复制/粘贴,但是我会看看哪些特定的部分对你有用。
发布于 2012-11-22 13:50:58
您可以创建一个可重用的范围模式类:
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; } }
}您可以添加所有需要合并范围、获取交叉点等的方法.
https://stackoverflow.com/questions/13513932
复制相似问题