转换为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是否也存在差距?
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();
}