private void UpdateTotalsYearDelta(YearlyTally previousYearTally) { DaysInYearDelta = DaysSinceStart - previousYearTally.DaysSinceStart; YearDeltaPages = TotalPages - previousYearTally.TotalPages; YearDeltaBooks = TotalBooks - previousYearTally.TotalBooks; YearDeltaBooksInEnglish = TotalBooksInEnglish - previousYearTally.TotalBooksInEnglish; YearDeltaBookFormat = TotalBookFormat - previousYearTally.TotalBookFormat; YearDeltaComicFormat = TotalComicFormat - previousYearTally.TotalComicFormat; YearDeltaAudioFormat = TotalAudioFormat - previousYearTally.TotalAudioFormat; YearDeltaPageRate = YearDeltaPages / (float)DaysInYearDelta; if (YearDeltaBooks >= 1) { TotalDaysPerBook = DaysInYearDelta / (float)YearDeltaBooks; TotalPagesPerBook = YearDeltaPages / (float)YearDeltaBooks; TotalBooksPercentageInEnglish = YearDeltaBooksInEnglish / (float)YearDeltaBooks; } }
private void UpdateTotalsSinceStart(YearlyTally currentTally) { TotalPages = currentTally.TotalPages; TotalBooks = currentTally.TotalBooks; TotalBooksInEnglish = currentTally.TotalBooksInEnglish; TotalBookFormat = currentTally.TotalBookFormat; TotalComicFormat = currentTally.TotalComicFormat; TotalAudioFormat = currentTally.TotalAudioFormat; if (DaysSinceStart >= 1) { TotalPageRate = TotalPages / (float)DaysSinceStart; } if (TotalBooks >= 1) { TotalDaysPerBook = DaysSinceStart / (float)TotalBooks; TotalPagesPerBook = TotalPages / (float)TotalBooks; TotalBooksPercentageInEnglish = TotalBooksInEnglish / (float)TotalBooks; } }
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()); }