Search code examples
c#asp.netlinqoverlapgaps-in-data

Transform to Linq (overlap validations)


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?


Solution

  • 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();