/// <summary>取得日期時間區段清單的聯集</summary> public static IEnumerable <DateTimeSection> UnionSection(this IEnumerable <DateTimeSection> source, IEnumerable <DateTimeSection> target) { source = source.Concat(target).Where(x => x != null).OrderBy(x => x.Start); using (IEnumerator <DateTimeSection> iter = source.GetEnumerator()) { if (!iter.MoveNext()) { yield break; } var cursor = new DateTimeSection(iter.Current); while (iter.MoveNext()) { if (iter.Current.Start <= cursor.End) { cursor.End = OrionUtils.Max(iter.Current.End, cursor.End); continue; } yield return(cursor); cursor = new DateTimeSection(iter.Current); } yield return(cursor); } }
/// <summary>取得重疊日期時間區段</summary> public static DateTimeSection Overlap(this DateTimeSection sectionA, DateTimeSection sectionB) { return(new DateTimeSection { Start = OrionUtils.Max(sectionA.Start, sectionB.Start), End = OrionUtils.Min(sectionA.End, sectionB.End), }); }