protected override IEnumerable <DateTime> GetNextOccurrencesInternal(DateTime startDate)
        {
            var byWeekDays = ByWeekDays?.ToList();

            if (IsEmpty(byWeekDays))
            {
                byWeekDays = new List <DayOfWeek> {
                    startDate.DayOfWeek
                };
            }

            var dayOffsets  = byWeekDays.Select(day => (day - WeekStart + 7) % 7).Distinct().OrderBy(a => a).ToList();
            var startOfWeek = Extensions.StartOfWeek(startDate, WeekStart);

            while (true)
            {
                var b = true;
                if (!IsEmpty(ByMonths))
                {
                    if (!ByMonths.Contains((Month)startDate.Month))
                    {
                        b = false;
                    }
                }

                if (b)
                {
                    foreach (var dayOffset in dayOffsets)
                    {
                        var next = startOfWeek.AddDays(dayOffset);
                        if (next >= startDate)
                        {
                            yield return(next);
                        }
                    }
                }

                startOfWeek = startOfWeek.AddDays(7 * Interval);
            }
        }
Exemple #2
0
        protected override IEnumerable <DateTime> GetNextOccurrencesInternal(DateTime startDate)
        {
            while (true)
            {
                var b = true;

                if (!IsEmpty(ByMonths))
                {
                    if (!ByMonths.Contains((Month)startDate.Month))
                    {
                        b = false;
                    }
                }

                if (!IsEmpty(ByMonthDays))
                {
                    if (!ByMonthDays.Contains(startDate.Day))
                    {
                        b = false;
                    }
                }

                if (!IsEmpty(ByWeekDays))
                {
                    if (!ByWeekDays.Contains(startDate.DayOfWeek))
                    {
                        b = false;
                    }
                }

                if (b)
                {
                    yield return(startDate);
                }

                startDate = startDate.AddDays(Interval);
            }

            // ReSharper disable once FunctionNeverReturns (UNTIL & COUNT are handled by GetNextOccurrences)
        }
        protected override IEnumerable <DateTime> GetNextOccurrencesInternal(DateTime startDate)
        {
            if (IsEmpty(ByWeekDays))
            {
                ByWeekDays = new List <DayOfWeek> {
                    startDate.DayOfWeek
                };
            }

            var dayOffsets  = ByWeekDays.Select(day => ((day - WeekStart) + 7) % 7).Distinct().OrderBy(a => a).ToList();
            var startOfWeek = startDate.StartOfWeek(WeekStart);

            while (true)
            {
                var b = true;
                if (!IsEmpty(ByMonths))
                {
                    if (!ByMonths.Contains((Month)startDate.Month))
                    {
                        b = false;
                    }
                }

                if (b)
                {
                    foreach (var dayOffset in dayOffsets)
                    {
                        var next = startOfWeek.AddDays(dayOffset);
                        if (next >= startDate)
                        {
                            yield return(next);
                        }
                    }
                }

                startOfWeek = startOfWeek.AddDays(7 * Interval);
            }

            // ReSharper disable once FunctionNeverReturns (UNTIL & COUNT are handled by GetNextOccurrences)
        }
        private List <DateTime> ResultByMonths(DateTime startOfYear)
        {
            List <DateTime> result = null;

            if (!IsEmpty(ByMonths))
            {
                result = new List <DateTime>();
                foreach (var month in ByMonths.Distinct().OrderBy(_ => _))
                {
                    if (month >= Month.January && month <= Month.December)
                    {
                        for (var dt = startOfYear.AddMonths((int)month - 1); dt.Month == (int)month; dt = dt.AddDays(1))
                        {
                            result.Add(dt);
                        }
                    }
                }

                //result.Sort();
                //result = FilterBySetPosition(result, BySetPositions).ToList();
            }
            return(result);
        }