This can help you remove a range from another or from a set of ranges:
public class Range { public int Start { get; private set; } public int End { get; private set; } public Range(int start, int end) { Start = start; End = end; } public IEnumerable<Range> RemoveFrom(Range range) { return RemoveFrom(new Range[] { range }); } public IEnumerable<Range> RemoveFrom(IEnumerable<Range> items) { foreach (Range item in items) { if (End >= item.Start && Start <= item.End) { if (item.Start <= Start) { yield return new Range(item.Start, Start); } if (item.End >= End) { yield return new Range(End, item.End); } } else { yield return item; } } } }
Example:
Range range = new Range(1, 20); foreach (Range r in new Range(15,18).RemoveFrom(range)) { Console.WriteLine("{0} - {1}", r.Start, r.End); }
Conclusion:
1 - 15 18 - 20
An example of removing multiple ranges from other ranges:
Range[] items = new Range[] { new Range(1, 100), new Range(200, 300) }; Range[] exclude = new Range[] { new Range(25, 75), new Range(250, 280), new Range(90, 210) }; foreach (Range r in exclude) { items = r.RemoveFrom(items).ToArray(); } foreach (Range r in items) { Console.WriteLine("{0} - {1}", r.Start, r.End); }
Conclusion:
1 - 25 75 - 90 210 - 250 280 - 300
Guffa source share