Использование улучшенного метода расширения для вычисления стандартного отклонения в C#
Пример
К сожалению, поскольку этот пример работает с целыми числами, он не может работать с другими типами данных. Риан Мейер показал мне этот метод, который использует дженерики для работы с другими типами данных.
Новый метод применяется к родовому типу IEnumerable & lt; T & gt;. В идеале было бы неплохо ограничить общий тип T числовыми типами, но C# не имеет синтаксиса для этого.
Решение Rian должно было использовать следующий код для проверки элементов в IEnumerable, чтобы увидеть, могут ли они быть преобразованы в двойные.
double testDouble; bool isNumeric = values.All( value => double.TryParse(value.ToString(), out testDouble)); if (!isNumeric) return double.NaN;
Это работает, но я предпочитаю исключать исключение вместо возврата NaN. Таким образом, программист не может случайно думать, что возвращаемый результат является стандартным отклонением. Если есть проблема, это будет немедленно очевидно, поэтому программист может ее исправить.
В следующем коде показан новый метод расширения.
// Возвращает стандартное отклонение массива парных разрядов. // // Если второй аргумент равен True, оцените как образец. // Если второй аргумент False, оцените как совокупность. public static double StdDev(this IEnumerable values, bool as_sample) { // Преобразуем в перечислимое число пар. IEnumerable doubles = values.Select(value => Convert.ToDouble(value)); // Получить среднее значение. double mean = doubles.Sum() / doubles.Count(); // Получим сумму квадратов различий // между значениями и средним значением. var squares_query = from double value in doubles select (value - mean) * (value - mean); double sum_of_squares = squares_query.Sum(); if (as_sample) { return Math.Sqrt(sum_of_squares / (doubles.Count() - 1)); } else { return Math.Sqrt(sum_of_squares / doubles.Count()); } }
// Возвращает стандартное отклонение массива парных разрядов. // // Если второй аргумент равен True, оцените как образец. // Если второй аргумент False, оцените как совокупность. public static double StdDev & lt; T & gt; (эти значения IEnumerable & lt; T & gt; bool as_sample) { // Преобразуем в перечислимое число пар. IEnumerable & л; двойной & GT; удваивает = values.Select (значение = & gt; Convert.ToDouble (значение)); // Получить среднее значение. double mean = doubles.Sum () / doubles.Count (); // Получим сумму квадратов различий // между значениями и средним значением. var squares_query = от двойного значения в двойных select (value - mean) * (значение - среднее значение); double sum_of_squares = squares_query.Sum (); if (as_sample) { return Math.Sqrt (sum_of_squares / (doubles.Count () - 1)); } еще { return Math.Sqrt (sum_of_squares / doubles.Count ()); } }
...