public DateTime GetNext(DateTime value) { var minute = value.Minute; var hour = value.Hour; var day = value.Day; var month = value.Month; var year = value.Year; if (minuteRule.NextOrReset(minute, out minute)) { hour++; } if (!hourRule.Contains(hour)) { if (hourRule.NextOrReset(hour, out hour)) { day++; } minute = minuteRule.First(); } if (!dayRule.Contains(day)) { if (dayRule.NextOrReset(day, out day)) { month++; } minute = minuteRule.First(); hour = hourRule.First(); } if (!monthRule.Contains(month)) { if (monthRule.NextOrReset(month, out month)) { year++; } minute = minuteRule.First(); hour = hourRule.First(); day = dayRule.First(); } return(new DateTime(year, month, day, hour, minute, 0)); }