private void TestOverlaps(OverlapsInclude overlapsInclude, DateTime now) { //current => |****| //1 => |****| //2 => |****| //3 => |**| //4 => |****| //5 => |****| //6 => |***>| //7 => |<***| var current = DateTimeRange.Create(now.AddHours(1), now.AddHours(2)); var dateTimeRange1 = DateTimeRange.Create(_mockNow.AddHours(0), _mockNow.AddHours(0.5)); var dateTimeRange2 = DateTimeRange.Create(_mockNow.AddHours(0.5), _mockNow.AddHours(1.5)); var dateTimeRange3 = DateTimeRange.Create(_mockNow.AddHours(1.2), _mockNow.AddHours(1.6)); var dateTimeRange4 = DateTimeRange.Create(_mockNow.AddHours(1.6), _mockNow.AddHours(2.5)); var dateTimeRange5 = DateTimeRange.Create(_mockNow.AddHours(2.5), _mockNow.AddHours(3)); var dateTimeRange6 = DateTimeRange.Create(_mockNow.AddHours(0.5), _mockNow.AddHours(1)); var dateTimeRange7 = DateTimeRange.Create(_mockNow.AddHours(2), _mockNow.AddHours(3)); current.Overlaps(dateTimeRange1, overlapsInclude).ShouldFalse(); current.Overlaps(dateTimeRange2, overlapsInclude).ShouldTrue(); current.Overlaps(dateTimeRange3, overlapsInclude).ShouldTrue(); current.Overlaps(dateTimeRange4, overlapsInclude).ShouldTrue(); current.Overlaps(dateTimeRange5, overlapsInclude).ShouldFalse(); if (overlapsInclude == OverlapsInclude.Begin || overlapsInclude == OverlapsInclude.Both) { current.Overlaps(dateTimeRange6, overlapsInclude).ShouldTrue(); } else { current.Overlaps(dateTimeRange6, overlapsInclude).ShouldFalse(); } if (overlapsInclude == OverlapsInclude.End || overlapsInclude == OverlapsInclude.Both) { current.Overlaps(dateTimeRange7, overlapsInclude).ShouldTrue(); } else { current.Overlaps(dateTimeRange7, overlapsInclude).ShouldFalse(); } }
public static bool Overlaps <TSource>(this TSource dateTimeRange, DateTime begin, DateTime?end, OverlapsInclude overlapsInclude = OverlapsInclude.None) where TSource : IDateTimeRange { var endValue = end ?? DateTime.MaxValue; switch (overlapsInclude) { case OverlapsInclude.None: return(dateTimeRange.Begin < endValue && dateTimeRange.End > begin); case OverlapsInclude.Begin: return(dateTimeRange.Begin <= endValue && dateTimeRange.End > begin); case OverlapsInclude.End: return(dateTimeRange.Begin < endValue && dateTimeRange.End >= begin); case OverlapsInclude.Both: return(dateTimeRange.Begin <= endValue && dateTimeRange.End >= begin); default: throw new ArgumentOutOfRangeException(nameof(overlapsInclude), overlapsInclude, null); } }
public static bool Overlaps <TSource>(this TSource dateTimeRange, IDateTimeRange another, OverlapsInclude overlapsInclude = OverlapsInclude.None) where TSource : IDateTimeRange { return(dateTimeRange.Overlaps(another.Begin, another.End, overlapsInclude)); }
public static IEnumerable <TSource> FilterOverlaps <TSource>(this IEnumerable <TSource> dateTimeRanges, DateTime begin, DateTime?end, OverlapsInclude overlapsInclude = OverlapsInclude.None) where TSource : IDateTimeRange { return(dateTimeRanges.Where(x => x.Overlaps(begin, end))); }