public virtual IReadOnlyCollection <TimeRange> RemoveRanges(IReadOnlyCollection <TimeRange> rangesToRemove) { rangesToRemove.ThrowIfNullOrEmpty(nameof(rangesToRemove)); IReadOnlyCollection <DayRange> days = SplitByDays(); DayRange[] daysNotInTheRangesToRemove = days .Where(day => rangesToRemove.All(range => !range.Contains(day))) .OrderBy(x => x.From) .ToArray(); if (!daysNotInTheRangesToRemove.Any()) { return(Array.Empty <TimeRange>()); } var result = new List <TimeRange>(); DayRange previous, start; previous = start = daysNotInTheRangesToRemove.First(); // index = 1 because we have to skip the first element for (var index = 1; index < daysNotInTheRangesToRemove.Length; index++) { DayRange dayRange = daysNotInTheRangesToRemove[index]; if (!dayRange.NextFor(previous)) { result.Add(new TimeRange( start.AsDate(), daysNotInTheRangesToRemove[index - 1].AsDate())); start = dayRange; } if (index == daysNotInTheRangesToRemove.Length - 1) { result.Add(new TimeRange( start.AsDate(), dayRange.AsDate())); } previous = dayRange; } return(result); }
public bool NextFor(DayRange second) { second.ThrowIfNull(nameof(second)); return(this.AsDate().SameDay(second.AsDate().AddDays(1))); }