0

I Have a Tuple list and I want to find overlaps:

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;
}

How can I transform this into linq? How can I find if exists gaps with linq, too?

Adam Lear
  • 38,111
  • 12
  • 81
  • 101
Bruno
  • 438
  • 1
  • 5
  • 13

3 Answers3

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))
Lee
  • 142,018
  • 20
  • 234
  • 287
  • And if i want to find gaps? – Bruno Apr 06 '13 at 14:50
  • @user2252371 - If you mean you want to know if there are any adjacent elements which don't overlap, then just invert the condition given to `Any`. – Lee Apr 06 '13 at 14:56
0

With the power of ReSharper i present to you:

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

To find out if gaps exist or not you need to check whether the next elements start value is above your current elements end value. So just change > to <=.

return ranges.Where((t, i) => i + 1 < ranges.Length 
                     && !(t.Item1 < t.Item2 && ranges[i + 1].Item1 <= t.Item2)).Any();
MAV
  • 7,260
  • 4
  • 30
  • 47
0

Unfortunately you can't use .Any() here as it doesn't include an overload that allows access to an index.

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();
}
Daniel Imms
  • 47,944
  • 19
  • 150
  • 166