using System;
using System.Collections.Generic;
public static class MathUtil
{
public static double CalculateVariance(IEnumerable data, Func extractNumber)
{
var sumOfSquared = 0.0;
var sum = 0.0;
var length = 0;
foreach (var variable in data)
{
var number = extractNumber(variable);
sumOfSquared += (number * number);
sum += number;
length++;
}
if (length <= 1) return 0;
return CalculateVariance(sumOfSquared, sum, length);
}
public static double CalculateStandardDeviation(IEnumerable data, Func extractNumber)
{
var variance = CalculateVariance(data, extractNumber);
if (variance <= 1) return 0;
return Math.Sqrt(variance);
}
public static double CalculateVariance(double sumOfSquared, double sum, int length)
{
if (length <= 0)
{
throw new ArgumentException("CalculateVariance cannot accept length equal to or less than one", "length");
}
return (sumOfSquared - ((sum * sum) / length)) / (length - 1);
}
public static double CalculateStandardDeviation(double sumOfSquared, double sum, int length)
{
var variance = CalculateVariance(sumOfSquared, sum, length);
return Math.Sqrt(variance);
}
}