如何使用LINQ知道一组句点中是否有任何重叠

Hom*_*mam 5 c# linq

我有一系列时期[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)

如果我讨论更多情况,我认为查询将变得更加复杂.

我想知道你是否可以用最简单有效的方式帮助我.

问候.

Ste*_*ung 7

改为采用这种方式:如果检查日期是从起始日期开始,或者检查日期是从日期开始,那么就没有相互作用.假设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)

  • 在一个表达式中使用`=>`,`<=`和`> =`的+1 (2认同)

sta*_*ica 6

如果对象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)

为了说明这是怎么回事,让我们来看看这两个情况下,有没有之间的重叠ab:

//                         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)