Я делаю это достаточно, чтобы я создал метод расширения для LINQ.
public static double WeightedAverage<T>(this IEnumerable<T> records, Func<T, double> value, Func<T, double> weight)
{
double weightedValueSum = records.Sum(x => value(x) * weight(x));
double weightSum = records.Sum(x => weight(x));
if (weightSum != 0)
return weightedValueSum / weightSum;
else
throw new DivideByZeroException("Your message here");
}
После получения подмножества данных вызов выглядит следующим образом.
double weightedAverage = records.WeightedAverage(x => x.Value, x => x.Length);
Это стало чрезвычайно удобно, потому что я могу получить средневзвешенное значение для любой группы данных на основе другого поля в той же записи.
Обновление
Теперь я проверяю деление на ноль и генерирую более подробное исключение вместо возврата 0. Позволяет пользователю перехватывать исключение и обрабатывать его по мере необходимости.