using System.Collections.Generic;
using System.Diagnostics;
public static void Main()
List<double> powerValues = new List<double>
List<double> durations = new List<double>
Stopwatch sw = new Stopwatch();
var result1 = CalculateCumulativeAveragePower(powerValues, durations);
Stopwatch sw2 = new Stopwatch();
var result2 = CalculateCumulativeAveragePowerWithLinq(powerValues, durations);
Stopwatch sw3 = new Stopwatch();
var result3 = CalculateCumulativeAveragePowerFinal(powerValues, durations);
Console.WriteLine("First solution:");
Console.WriteLine("Passed tests: {0}", TestIntervalPowerCalculations(result1));
Console.WriteLine("Elapsed First={0}\n", sw.Elapsed);
Console.WriteLine("Second solution:");
Console.WriteLine("Passed tests: {0}", TestIntervalPowerCalculations(result2.ToList()));
Console.WriteLine("Elapsed Second={0}\n", sw2.Elapsed);
Console.WriteLine("Third solution:");
Console.WriteLine("Passed tests: {0}", TestFinalPowerCalculation(result3));
Console.WriteLine("Elapsed Third={0}", sw3.Elapsed);
private static List<double> CalculateCumulativeAveragePower(List<double> powerValues, List<double> durations)
int n = powerValues.Count;
var cumulativeAverage = new List<double>(n);
for (int i = 0; i < n; i++)
totalPower += powerValues[i] * durations[i];
totalTime += durations[i];
cumulativeAverage.Add(totalPower / totalTime);
return cumulativeAverage;
private static IEnumerable<double> CalculateCumulativeAveragePowerWithLinq(IEnumerable<double> powerValues, IEnumerable<double> durations)
return powerValues.Zip(durations, CalculatePowerAverage);
double CalculatePowerAverage(double powerValue, double durationValue)
totalPower += powerValue * durationValue;
totalTime += durationValue;
return totalPower / totalTime;
private static double CalculateCumulativeAveragePowerFinal(IEnumerable<double> powerValues, IEnumerable<double> durations)
double totalTime = durations.Aggregate((runningTotal, duration) => runningTotal += duration);
return powerValues.Zip(durations, (power, duration) => power * duration / totalTime).Sum();
private static bool TestIntervalPowerCalculations(List<double> powerCalculationAnswers)
List<double> expectedAnswers = new List<double>
for (var i = 0; i < expectedAnswers.Count(); i++)
if (powerCalculationAnswers[i] != expectedAnswers[i])
private static bool TestFinalPowerCalculation(double finalPowerCalculation)
return finalPowerCalculation == 198.26388888888889;