private IEnumerable <WorkPatternRepresentation> CombineWeeklyPatternsIntoMonthlyOnes( List <WorkPatternRepresentation> weeklyPatterns) { DaysInMonth.ToString(); WorkdaysInMonth.ToString(); var patternValidator = new WorkPatternValidator(new List <BusinessRule>()); var monthlyPatterns = new List <WorkPatternRepresentation>(); var random = new Random(); foreach (var weeklyPattern in weeklyPatterns) { var monthlyPattern = weeklyPattern; // just consider 5 weekly patterns will cover the month // (normally, we should find the first multiple of 5 larger than WorkDaysInMonth) // TODO the Times() extension method would be useful here for (var count = 0; count < 5; count += 1) { var randomIndex = random.Next(0, weeklyPatterns.Count); var randomNextPattern = weeklyPatterns.ElementAt(randomIndex); var candidateForExtendedPattern = new WorkPatternRepresentation( monthlyPattern.Concat(randomNextPattern)); while (!patternValidator.Validate(candidateForExtendedPattern)) { randomIndex = random.Next(0, weeklyPatterns.Count); randomNextPattern = weeklyPatterns.ElementAt(randomIndex); candidateForExtendedPattern = new WorkPatternRepresentation( monthlyPattern.Concat(randomNextPattern)); } // TODO as a safety measure, the above loop should be forcefully // exited if it has been looping for a large number of times monthlyPattern = candidateForExtendedPattern; } monthlyPatterns.Add(monthlyPattern); } return(monthlyPatterns); }