public static double Variance(this IEnumerable <double> source) { if (source == null) { throw new ArgumentNullException(NameOf.GetCallerName() + ": source"); } long n = 0; double mean = 0; double M2 = 0; checked { foreach (double x in source) { n++; double delta = x - mean; mean += delta / n; M2 += delta * (x - mean); } } if (source.Count() < 2) { if (source.Count() == 1) { return(double.NaN); } //TODO : Exception throw new InvalidOperationException(NameOf.GetCallerName() + ": source contains no elements."); } return((double)(M2 / (n - 1))); }