0

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

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 是否也存在差距?

4

3 回答 3

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))
于 2013-04-06T14:36:35.107 回答
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();
于 2013-04-06T14:35:39.257 回答
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();
}
于 2013-04-06T14:42:28.137 回答