private Month createMonthWithContainDaysOfDifferentMonth(IEnumerable <RelationalDay> days, DateTime monthFirstDay, DayOfWeek dayOfOrderStart) { RelationalDay firstDay = days.Reverse() .SkipWhile(x => monthFirstDay < x.Day) .FirstOrDefault(x => x.Day.DayOfWeek == dayOfOrderStart) ?? days.SkipWhile(x => x.Day < monthFirstDay).First(); Day previousWeekEndDay = new DateTime(firstDay.Day.Year, firstDay.Day.Month, firstDay.Day.DayOfMonth).AddDays(-1).ToDay(); var weeks = new List <Week>(); bool hasNextWeek = true; while (hasNextWeek) { int count = 0; List <RelationalDay> daysOfWeek = days.SkipWhile(x => x.Day < firstDay.Day) .SkipWhile(x => x.Day <= previousWeekEndDay) .Do(_ => count++) .TakeWhile(x => count == 1 || x.Day.DayOfWeek != dayOfOrderStart) .ToList(); if (daysOfWeek.Count != 0 && (weeks.Count != 0 && daysOfWeek.FirstOrDefault()?.Day?.Month == monthFirstDay.Month || weeks.Count == 0)) { weeks.Add(new Week { Days = daysOfWeek }); previousWeekEndDay = daysOfWeek.Last().Day; } else { hasNextWeek = false; } } return(new Month { Year = monthFirstDay.Year, MonthOfYear = monthFirstDay.Month, Weeks = weeks }); }
private Month createMonth(IEnumerable <RelationalDay> days, DateTime monthFirstDay, DayOfWeek dayOfOrderStart) { RelationalDay firstDay = days.SkipWhile(x => x.Day < monthFirstDay) .First(); DayOfWeek dayOfOrderEnd = calculateDayOfOrderEnd(dayOfOrderStart); Day previousWeekEndDay = new DateTime(firstDay.Day.Year, firstDay.Day.Month, firstDay.Day.DayOfMonth).AddDays(-1).ToDay(); var weeks = new List <Week>(); bool hasNextWeek = true; while (hasNextWeek) { bool isEndWeek = false; List <RelationalDay> daysOfWeek = days.SkipWhile(x => x.Day < firstDay.Day) .SkipWhile(x => x.Day <= previousWeekEndDay) .TakeWhile(x => x.Day.Month == monthFirstDay.Month && isEndWeek == false) .Do(x => isEndWeek = x.Day.DayOfWeek == dayOfOrderEnd) .ToList(); if (daysOfWeek.Count != 0) { weeks.Add(new Week { Days = daysOfWeek }); previousWeekEndDay = daysOfWeek.Last().Day; } else { hasNextWeek = false; } } return(new Month { Year = monthFirstDay.Year, MonthOfYear = monthFirstDay.Month, Weeks = weeks }); }