private DateTime FindNextRelevantDate(DateTime datetime) { var relevantDateTime = new DateTime(); day = datetime.Day; month = datetime.Month; year = datetime.Year; var maxDay = Days.Max(); var maxMonth = Months.Max(); var maxYear = Years.Max(); var maxDate = new DateTime(maxYear, maxMonth, maxDay).Date; bool added = false; while (datetime.Date != maxDate) { if (DaysOfWeek.Contains((int)datetime.DayOfWeek)) { relevantDateTime = datetime; break; } else { added = false; } AddNext(Days, ref day, ref added); var monthAdded = AddNext(Months, ref month, ref added); if (monthAdded) { day = GetClosestDay(datetime, year, month); } AddNext(Years, ref year, ref added); datetime = new DateTime(year, month, day, datetime.Hour, datetime.Minute, datetime.Second, datetime.Millisecond); } return(relevantDateTime); }