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.Endtry-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。正确答案是正确的。