public static IEnumerable <DateTime> DatesOnSelectedDays(this DateRange dateRange, DaySelection daySelection) => dateRange.Start.DatesOnSelectedDaysAfter(daySelection) .TakeWhile(date => date <= dateRange.End);
public static IEnumerable <DateTime> DatesOnSelectedDaysAfter(this DateTime dateRange, DaySelection daySelection) { if (!daySelection.Any()) { yield break; } var dayDates = new List <DateTime>(capacity: 7); var date = dateRange; for (int i = 0; i < 7; i++) { if (daySelection.Contains(date.DayOfWeek)) { dayDates.Add(date); yield return(date); } date = date.AddDays(1); } while (true) { for (int i = 0; i < dayDates.Count; i++) { date = dayDates[i] = dayDates[i].AddDays(7); yield return(date); } } }