我有一个元组列表,我想找到重叠:
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存在的差距呢?
答案 0 :(得分:1)
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))
答案 1 :(得分:0)
借助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();
答案 2 :(得分:0)
很遗憾,您无法在此处使用.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();
}