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