转换为Linq(重叠验证)

本文关键字:验证 重叠 Linq 转换 | 更新日期: 2023-09-27 18:07:39

我有一个元组列表,我想找到重叠:

static bool Overlap(params Tuple<int, int>[] ranges) {
    for (int i = 0; i < ranges.Length; i++) {
        if (i + 1 < ranges.Length) {
            if (!(ranges[i].Item1 < ranges[i].Item2 
                  && ranges[i + 1].Item1 > ranges[i].Item2)) {
                return true;
            }
        }
    }
    return false;
}

如何将其转换为linq?我怎样才能发现linq是否也存在差距?

转换为Linq(重叠验证)

return ranges
    .Zip(ranges.Skip(1), (t1, t2) => new { T1 = t1, T2 = t2 })
    .Any(p => !(p.T1.Item1 < p.T1.Item2 && p.T2.Item1 > p.T1.Item2))

随着ReSharper的力量呈现给你:

return ranges.Where((t, i) => i + 1 < ranges.Length 
                     && !(t.Item1 < t.Item2 && ranges[i + 1].Item1 > t.Item2)).Any();

要找出是否存在空白,您需要检查下一个元素的开始值是否高于当前元素的结束值。所以把>改成<=

return ranges.Where((t, i) => i + 1 < ranges.Length 
                     && !(t.Item1 < t.Item2 && ranges[i + 1].Item1 <= t.Item2)).Any();

不幸的是,你不能在这里使用。any(),因为它不包含允许访问索引的重载。

static bool Overlap(params Tuple<int, int>[] ranges) {
    return ranges
        .Where((range, i) =>
            i < ranges.Length && 
            !(range.Item1 < range.Item2 && 
              ranges[i + 1].Item1 > range.Item2)
        .Any();
}