/// <summary> /// Merges the set of <see cref="TimeRange"/> instances into the smallest /// non-overlapping set. /// </summary> /// <param name="ranges"> /// The ranges. /// </param> /// <returns> /// The smallest set of non-overlapping <see cref="TimeRange"/>s. /// </returns> public static IList <TimeRange> Union(IEnumerable <TimeRange> ranges) { TimeRange[] orderedRanges = ranges.Select(tr => tr.AsOrdered()) .OrderBy(tr => tr.StartTime) .ToArray(); List <TimeRange> rangeUnion = new List <TimeRange>(); if (!orderedRanges.Any()) { return(rangeUnion); } TimeRange currentRange = orderedRanges[0]; for (int i = 1; i < orderedRanges.Length; i++) { TimeRange newRange = orderedRanges[i]; if (newRange.IntersectsWith(currentRange)) { currentRange.EndTime = Timestamp.Max(currentRange.EndTime, newRange.EndTime); } else { rangeUnion.Add(currentRange); currentRange = newRange; } } rangeUnion.Add(currentRange); return(rangeUnion); }
/// <summary> /// Gets the intersection of the two <see cref="TimeRange"/> instances. /// </summary> /// <param name="x"> /// The first time range. /// </param> /// <param name="y"> /// The second time range. /// </param> /// <returns> /// The intersection, if one exists; <c>null</c> otherwise. /// </returns> public static TimeRange?Intersect(TimeRange x, TimeRange y) { Timestamp maxStartTime = Timestamp.Max(x.AsOrdered().StartTime, y.AsOrdered().StartTime); Timestamp minEndTime = Timestamp.Min(x.AsOrdered().EndTime, y.AsOrdered().EndTime); if (minEndTime < maxStartTime) { return(null); } return(new TimeRange(maxStartTime, minEndTime)); }
/// <summary> /// Gets the maximum time in the <see cref="TimeRange"/>. /// </summary> /// <param name="timeRange"> /// The time range. /// </param> /// <returns> /// The maximum value. /// </returns> public static Timestamp MaxTime(this TimeRange timeRange) { return(Timestamp.Max(timeRange.StartTime, timeRange.EndTime)); }