#if TOTO using System.Collections.Generic; using System.Linq; using Developpez.Dotnet.Collections; namespace Developpez.Dotnet { public class Interval { private readonly T _start; private readonly T _end; public Interval(T start, T end) { _start = start; _end = end; } public T Start { get { return _start; } } public T End { get { return _end; } } public bool OverlapsWith(Interval other, IComparer comparer = null) { comparer = comparer ?? Comparer.Default; return this.Contains(other.Start, comparer) || this.Contains(other.End, comparer) || other.Contains(this.Start, comparer) || other.Contains(this.End, comparer); } public Interval Union(Interval other, IComparer comparer = null) { comparer = comparer ?? Comparer.Default; T start = comparer.Min(this.Start, other.Start); T end = comparer.Max(this.End, other.End); return Interval.Create(start, end); } public Interval Intersection(Interval other, IComparer comparer = null) { comparer = comparer ?? Comparer.Default; T start = comparer.Max(this.Start, other.Start); T end = comparer.Min(this.End, other.End); return Interval.Create(start, end); } public bool Contains(T value, IComparer comparer = null) { comparer = comparer ?? Comparer.Default; return comparer.Compare(this.Start, value) <= 0 && comparer.Compare(value, this.End) <= 0; } } public static class Interval { public static Interval Create(T start, T end) { return new Interval(start, end); } } public static class IntervalExtensions { public static IEnumerable> Consolidate(this IEnumerable> intervals) { return intervals.Consolidate(null); } public static IEnumerable> Consolidate(this IEnumerable> intervals, IComparer comparer) { comparer = comparer ?? Comparer.Default; bool first = true; Interval prev = null; intervals = intervals.OrderBy(i => i.Start, comparer) .ThenBy(i => i.End, comparer); foreach (var item in intervals) { if (first) { prev = item; first = false; continue; } if (item.OverlapsWith(prev)) { prev = item.Union(prev); } else { yield return prev; prev = item; } } if (!first) yield return prev; } } } #endif