/// <summary> /// Method to find out max emission each day and the generator name. /// Only Gas and coal generators as per wind generators do not have emission /// </summary> /// <param name="incomingGeneratedReport"></param> /// <returns></returns> private MaxEmissionGenerators MaxEmissionGeneratorPerDay(GenerationReport incomingGeneratedReport) { var maxEmissionGenerator = new MaxEmissionGenerators(); foreach (var generator in incomingGeneratedReport.coal.coalGenerator) { foreach (var day in generator.generation.day) { var coalDayOutput = new DayOutput { Name = generator.name, Date = day.date, Emission = TotalDailyEmissions(day.energy, generator.EmissionsRating, GetGeneratorFactorMapping(generator.name).emissionsFactor) }; SetMaxEmission(coalDayOutput); } } foreach (var generator in incomingGeneratedReport.gas.gasGenerator) { foreach (var day in generator.generation.day) { var gasdayOutput = new DayOutput { Name = generator.name, Date = day.date, Emission = TotalDailyEmissions(day.energy, generator.emissionsRating, GetGeneratorFactorMapping(generator.name).emissionsFactor) }; SetMaxEmission(gasdayOutput); } } var dayOutput = _lsFinalMaxGenOutput.GroupBy(x => x.Date) .OrderBy(g => g.Key); var lsfinalDayOutput = dayOutput.SelectMany(@group => @group.OrderByDescending(c => c.Emission).Take(1)).ToList(); maxEmissionGenerator.Days = lsfinalDayOutput; return(maxEmissionGenerator); }
/// <summary> /// SetEmission - Add emission for each generator in existing list /// If name and date is a match, this means cumulative emission and emission for generator needs to be updated in final list. /// if name is same but date different, then new entry for the generator /// else it is a new entry /// </summary> /// <param name="incomingDayOutput"></param> private void SetMaxEmission(DayOutput incomingDayOutput) { if (_lsFinalMaxGenOutput.Exists(x => string.Equals(x.Name.ToLower(), incomingDayOutput.Name.ToLower(), StringComparison.CurrentCultureIgnoreCase) && x.Date.Date == incomingDayOutput.Date.Date)) { var index = _lsFinalMaxGenOutput.FindIndex(generator => string.Equals(generator.Name.ToLower(), incomingDayOutput.Name.ToLower(), StringComparison.CurrentCultureIgnoreCase)); var updatedValue = new DayOutput { Date = incomingDayOutput.Date, Name = incomingDayOutput.Name, Emission = _lsFinalMaxGenOutput[index].Emission + incomingDayOutput.Emission }; _lsFinalMaxGenOutput[index] = updatedValue; } else if (_lsFinalMaxGenOutput.Exists(x => String.Equals(x.Name, incomingDayOutput.Name, StringComparison.CurrentCultureIgnoreCase) && x.Date.Date != incomingDayOutput.Date.Date)) { _lsFinalMaxGenOutput.Add(incomingDayOutput); } else { _lsFinalMaxGenOutput.Add(incomingDayOutput); } }