Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如果我有两个时间段,如何确定它们是否重叠?_C#_.net 3.5_Date Range - Fatal编程技术网

C# 如果我有两个时间段,如何确定它们是否重叠?

C# 如果我有两个时间段,如何确定它们是否重叠?,c#,.net-3.5,date-range,C#,.net 3.5,Date Range,可能重复: 假设我有两个对象,每个对象都有一个介于其结束日期和开始日期之间的日期范围,我如何以最有效或最快的方式确定两个日期范围之间是否有重叠 我想用.NET 3.5 c#来做这件事,我不确定这是最有效还是最快的,但我会这样做。如果结果是一个瓶颈,那么,也只有到那时,我才会进一步优化: 如果需要,可以通过交换范围来确保第一个范围更早开始(或同时开始) 然后,如果另一个范围开始小于或等于第一个范围结束(如果范围包含开始时间和结束时间),或者小于(如果范围包含开始时间和结束时间),则可以检测重叠

可能重复:

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


我想用.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之后启动,从而提前删除了一半的问题空间。

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

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

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

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

|----------------------|        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之后开始,从而提前删除了一半的问题空间,从而大大限制了必须进行的检查的数量。

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


bool重叠=(y.Start>x.Start&y.Startx.Start&y.End

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


bool重叠=(y.Start>x.Start&y.Startx.Start&y.End

try-try-x.开始:2001-01-01,x.停止:2002-01-01,Y.开始:1999-01-01,Y.停止:2001-06-01。函数返回false。正确答案是正确的。开始:2001-01-01,停止:2002-01-01,开始:1999-01-01,停止:2001-06-01。函数返回false。正确答案是正确的。