コード例 #1
0
        /// <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);
        }
コード例 #2
0
        /// <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));
 }