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);
                }
            }
        }