/// <summary> /// 두 기간 교차하거나, <paramref name="period"/>가 <paramref name="target"/> 의 내부 구간이면 true를 반환합니다. /// </summary> /// <param name="period"></param> /// <param name="target"></param> /// <returns></returns> public static bool IntersectsWith(this ITimePeriod period, ITimePeriod target) { target.ShouldNotBeNull("target"); var isIntersected = period.HasInside(target.Start) || period.HasInside(target.End) || (target.Start <period.Start && target.End> period.End); if (IsDebugEnabled) { log.Debug("period[{0}]와 target[{1}]이 교차 구간이 있는지 확인합니다. isIntersected=[{2}]", period.AsString(), target.AsString(), isIntersected); } return(isIntersected); }
/// <summary> /// 대상 TimePeriod 를 포함하는 TimePeriod 요소가 존재하는가? /// </summary> /// <param name="target"></param> /// <returns></returns> public virtual bool HasInsidePeriods(ITimePeriod target) { var result = _periods.Any(p => target.HasInside(p)); if(IsDebugEnabled) log.Debug("target[{0}]을 포함하는 요소가 존재하는가? [{1}]", target, result); return result; }
/// <summary> /// 대상 TimePeriod 를 포함하는 TimePeriod 요소가 존재하는가? /// </summary> /// <param name="target"></param> /// <returns></returns> public virtual bool HasInsidePeriods(ITimePeriod target) { var result = _periods.Any(p => target.HasInside(p)); if (IsDebugEnabled) { log.Debug("target[{0}]을 포함하는 요소가 존재하는가? [{1}]", target, result); } return(result); }
} // SortByDuration // ---------------------------------------------------------------------- public virtual bool HasInsidePeriods(ITimePeriod test) { if (test == null) { throw new ArgumentNullException("test"); } foreach (ITimePeriod period in periods) { if (test.HasInside(period)) { return(true); } } return(false); } // HasInsidePeriods
} // TimeGapCalculator // ---------------------------------------------------------------------- private ICalendarTimeRange FindLargestFreeTimeBlock(IEnumerable <ITimePeriod> reservations, ITimePeriod searchLimits = null, bool excludeWeekends = true) { TimePeriodCollection bookedPeriods = new TimePeriodCollection(reservations); if (searchLimits == null) { searchLimits = bookedPeriods; // use boundary of reservations } if (excludeWeekends) { Week currentWeek = new Week(searchLimits.Start); Week lastWeek = new Week(searchLimits.End); do { ITimePeriodCollection days = currentWeek.GetDays(); foreach (Day day in days) { if (!searchLimits.HasInside(day)) { continue; // outside of the search scope } if (day.DayOfWeek == DayOfWeek.Saturday || day.DayOfWeek == DayOfWeek.Sunday) { bookedPeriods.Add(day); // // exclude weekend day } } currentWeek = currentWeek.GetNextWeek(); } while (currentWeek.Start < lastWeek.Start); } // calculate the gaps using the time calendar as period mapper TimeGapCalculator <TimeRange> gapCalculator = new TimeGapCalculator <TimeRange>(new TimeCalendar()); ITimePeriodCollection freeTimes = gapCalculator.GetGaps(bookedPeriods, searchLimits); if (freeTimes.Count == 0) { return(null); } freeTimes.SortByDuration(); // move the largest gap to the start return(new CalendarTimeRange(freeTimes[0])); } // FindLargestFreeTimeBlock
} // HasInsidePeriods // ---------------------------------------------------------------------- public virtual ITimePeriodCollection InsidePeriods(ITimePeriod test) { if (test == null) { throw new ArgumentNullException("test"); } TimePeriodCollection insidePeriods = new TimePeriodCollection(); foreach (ITimePeriod period in periods) { if (test.HasInside(period)) { insidePeriods.Add(period); } } return(insidePeriods); } // InsidePeriods
/// <summary> /// <paramref name="target"/> 기간을 포함하는 TimePeriod 들을 열거합니다. /// </summary> /// <param name="target"></param> /// <returns></returns> public virtual IEnumerable <ITimePeriod> InsidePeriods(ITimePeriod target) { return(_periods.Where(p => target.HasInside(p))); }
/// <summary> /// <paramref name="target"/> 기간을 포함하는 TimePeriod 들을 열거합니다. /// </summary> /// <param name="target"></param> /// <returns></returns> public virtual IEnumerable<ITimePeriod> InsidePeriods(ITimePeriod target) { return _periods.Where(p => target.HasInside(p)); }
// ---------------------------------------------------------------------- public ICalendarTimeRange FindLargestFreeTimeBlock( IEnumerable<ITimePeriod> reservations, ITimePeriod searchLimits = null, bool excludeWeekends = true) { TimePeriodCollection bookedPeriods = new TimePeriodCollection( reservations ); if ( searchLimits == null ) { searchLimits = bookedPeriods; // use boundary of reservations } if ( excludeWeekends ) { Week currentWeek = new Week( searchLimits.Start ); Week lastWeek = new Week( searchLimits.End ); do { ITimePeriodCollection days = currentWeek.GetDays(); foreach ( Day day in days ) { if ( !searchLimits.HasInside( day ) ) { continue; // outside of the search scope } if ( day.DayOfWeek == DayOfWeek.Saturday || day.DayOfWeek == DayOfWeek.Sunday ) { bookedPeriods.Add( day ); // // exclude weekend day } } currentWeek = currentWeek.GetNextWeek(); } while ( currentWeek.Start < lastWeek.Start ); } // calculate the gaps using the time calendar as period mapper TimeGapCalculator<TimeRange> gapCalculator = new TimeGapCalculator<TimeRange>( new TimeCalendar() ); ITimePeriodCollection freeTimes = gapCalculator.GetGaps( bookedPeriods, searchLimits ); if ( freeTimes.Count == 0 ) { return null; } freeTimes.SortByDuration(); // move the largest gap to the start return new CalendarTimeRange( freeTimes[ 0 ] ); }
// ---------------------------------------------------------------------- public virtual ITimePeriodCollection InsidePeriods( ITimePeriod test ) { if ( test == null ) { throw new ArgumentNullException( "test" ); } TimePeriodCollection insidePeriods = new TimePeriodCollection(); foreach ( ITimePeriod period in periods ) { if ( test.HasInside( period ) ) { insidePeriods.Add( period ); } } return insidePeriods; }
// ---------------------------------------------------------------------- public virtual bool HasInsidePeriods( ITimePeriod test ) { if ( test == null ) { throw new ArgumentNullException( "test" ); } foreach ( ITimePeriod period in periods ) { if ( test.HasInside( period ) ) { return true; } } return false; }