Exemplo n.º 1
0
        public static List <YearlyTally> GetYearlyTalliesForBooks(List <BookRead> allBooks)
        {
            List <BookRead> sortedBooks = allBooks.OrderBy(x => x.Date).ToList();
            DateTime        firstDay    = sortedBooks.First().Date;
            int             totalDays   = 1 + (int)(sortedBooks.Last().Date - firstDay).TotalDays;

            YearlyTally[] yearlyTallies = new YearlyTally[totalDays];

            for (int i = 0; i < totalDays; i++)
            {
                yearlyTallies[i] = new YearlyTally(firstDay, i);
            }

            YearlyTally currentTally = new YearlyTally();

            // fill in the days with books
            Dictionary <int, int> updatedDays = new Dictionary <int, int>();

            foreach (BookRead book in allBooks)
            {
                int daysSinceStart = (int)(book.Date - firstDay).TotalDays;

                currentTally.TotalPages += book.Pages;
                currentTally.TotalBooks++;

                if (book.OriginalLanguage == EnglishLanguage)
                {
                    currentTally.TotalBooksInEnglish++;
                }

                if (book.Format == BookFormat.Book)
                {
                    currentTally.TotalBookFormat++;
                }
                if (book.Format == BookFormat.Comic)
                {
                    currentTally.TotalComicFormat++;
                }
                if (book.Format == BookFormat.Audio)
                {
                    currentTally.TotalAudioFormat++;
                }

                yearlyTallies[daysSinceStart].UpdateTotalsSinceStart(currentTally);

                if (!updatedDays.ContainsKey(daysSinceStart))
                {
                    updatedDays.Add(daysSinceStart, daysSinceStart);
                }
            }

            // fill in the missing days with the totals for the day before
            for (int i = 1; i < totalDays; i++)
            {
                if (updatedDays.ContainsKey(i))
                {
                    continue;
                }

                yearlyTallies[i].UpdateTotalsSinceStart(yearlyTallies[i - 1]);
            }


            for (int i = DaysPerYear; i < totalDays; i++)
            {
                var previousYearTally = yearlyTallies[i - DaysPerYear];
                yearlyTallies[i].UpdateTotalsYearDelta(previousYearTally);
            }

            return(yearlyTallies.ToList());
        }