コード例 #1
0
ファイル: TimeRange.cs プロジェクト: spkik/net-blank-app
        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);
        }
コード例 #2
0
        public bool NextFor(DayRange second)
        {
            second.ThrowIfNull(nameof(second));

            return(this.AsDate().SameDay(second.AsDate().AddDays(1)));
        }