public void Aggregate(BomRainfallData bomRainfallData) { if (!bomRainfallData.Validate()) { return; } var date = bomRainfallData.GetDate(); if (!_weatherDataByYear.TryGetValue(date.Year, out var dataForYear)) { dataForYear = new WeatherDataForYear() { Year = date.Year }; _weatherDataByYear.Add(date.Year, dataForYear); } AggregateYearData(dataForYear, bomRainfallData); }
private static void AggregateYearData(WeatherDataForYear dataForYear, BomRainfallData bomRainfallData) { var rainfallReading = new RainfallReading(bomRainfallData.GetDate(), bomRainfallData.GetRainfall()); if (dataForYear.FirstDate == null || rainfallReading.Date < dataForYear.FirstDate) { dataForYear.FirstDate = rainfallReading.Date; } if (dataForYear.LastDate == null || rainfallReading.Date > dataForYear.LastDate) { dataForYear.LastDate = rainfallReading.Date; } if (rainfallReading.Rainfall > 0) { dataForYear.TotalRainfall += rainfallReading.Rainfall; dataForYear.DaysWithRainfall++; } else { dataForYear.DaysWithNoRainfall++; } dataForYear.AllReadings.Add(rainfallReading); var monthData = dataForYear.MonthlyAggregates.FirstOrDefault(month => month.MonthNumber == rainfallReading.Date.Month); if (monthData == null) { monthData = WeatherDataForMonth.FromDate(rainfallReading.Date); dataForYear.MonthlyAggregates.Add(monthData); } AggregateMonthData(monthData, rainfallReading); }