NSoft.NFramework.TimePeriods.Calendars.DateAdd.FindPreviousPeriod C# (CSharp) Method

FindPreviousPeriod() private static method

startperiods의 기간 중에 가장 가까운 기간에 속해 있으면 그 값을 반환하고, 아니면 start와 가장 근접하고, 선행되는 ITimePeriod를 찾는다. moment에는 가장 가까운 TimePeriod의 Start 속성 값을 지정합니다.
private static FindPreviousPeriod ( System.DateTime start, IEnumerable periods, System.DateTime &moment ) : ITimePeriod
start System.DateTime
periods IEnumerable
moment System.DateTime
return ITimePeriod
        private static ITimePeriod FindPreviousPeriod(DateTime start, IEnumerable<ITimePeriod> periods, out DateTime moment) {
            //! assumes no no overlapping periods in parameter periods (HashSet<ITimePeriod> 겠지?)

            if(IsDebugEnabled)
                log.Debug("시작시각의 이전 기간을 찾습니다... start=[{0}], periods=[{1}]", start, periods.CollectionToString());

            ITimePeriod nearestPeriod = null;
            var diffence = TimeSpan.MaxValue;
            moment = start;

            foreach(ITimePeriod period in periods) {
                // start가 기간에 속한다면...
                if(period.HasInside(start)) {
                    nearestPeriod = period;
                    moment = start;
                    break;
                }
                // 기간이 이미 start 이후라면 (After)
                if(period.Start > start)
                    continue;

                // 근처 값이 아니라면 포기
                //
                var periodToMement = start - period.End;
                if(periodToMement >= diffence)
                    continue;

                diffence = periodToMement;
                nearestPeriod = period;
                moment = nearestPeriod.End;
            }

            if(IsDebugEnabled)
                log.Debug("시작시각의 이전 기간을 찾았습니다!!! start=[{0}], moment=[{1}], nearestPeriod=[{2}]", start, moment, nearestPeriod);

            return nearestPeriod;
        }
    }