我有一系列时期[FromDate, ToDate].
我想知道在给定的时期和集合中的时期之间是否有任何重叠.
我已经开始这样了:
// periodToCheck is the given item
bool conflict = Periods.Any(p => ((p.FromDate >= periodToCheck.fromDate &&
p.FromDate <= periodToCheck.toDate)
||
(p.ToDate >= periodToCheck.fromDate &&
p.ToDate <= periodToCheck.toDate))
);
Run Code Online (Sandbox Code Playgroud)
它不能涵盖所有情况的问题,例如:
[2010.1.1], [2010.1.31]
[2010.1.5], [2010.1.6] // Is valid in the query in spite of it is not valid
// (because there is intersection).
Run Code Online (Sandbox Code Playgroud)
如果我讨论更多情况,我认为查询将变得更加复杂.
我想知道你是否可以用最简单有效的方式帮助我.
问候.
改为采用这种方式:如果检查日期是从起始日期开始,或者检查日期是从日期开始,那么就没有相互作用.假设check.from <= check.to.
Periods.Any(p => !(check.ToDate < p.FromDate || check.FromDate > p.ToDate));
Run Code Online (Sandbox Code Playgroud)
或(揭开负面后):
Periods.Any(p => check.ToDate >= p.FromDate && check.FromDate <= p.ToDate));
Run Code Online (Sandbox Code Playgroud)
如果对象FromDate <= ToDate始终成立Period,则可以按如下方式 定义辅助扩展方法OverlapsWith:
public static bool OverlapsWith(this Period a, Period b)
{
return !(b.ToDate <= a.FromDate || a.ToDate <= b.FromDate);
}
Run Code Online (Sandbox Code Playgroud)
为了说明这是怎么回事,让我们来看看这两个情况下,有没有之间的重叠a和b:
// a
// |-----------------|
// |--------| |-----------|
// b1 b2
Run Code Online (Sandbox Code Playgroud)
您可以根据此图检查上述条件.由于图显示了没有重叠的发生的情况下,但该方法确实应该测试为重叠时,条件需要被否定.它可以简化为以下内容:
b.ToDate > a.FromDate && a.ToDate > b.FromDate
Run Code Online (Sandbox Code Playgroud)
在LINQ查询中使用此方法时,很容易理解:
Periods.Any(period => period.OverlapsWith(periodToCheck))
Run Code Online (Sandbox Code Playgroud)