我的目标是从另一个表的主键获得一个加权平均值。

示例数据:

表格1

Key     WEIGHTED_AVERAGE

0200    0

表2
ForeignKey    Length    Value
0200          105       52
0200          105       60
0200          105       54
0200          105       -1
0200          47        55

我需要根据段的长度获取加权平均值,并且需要忽略-1的值。我知道如何在SQL中执行此操作,但我的目标是在LINQ中执行此操作。在SQL中看起来像这样:
SELECT Sum(t2.Value*t2.Length)/Sum(t2.Length) AS WEIGHTED_AVERAGE
FROM Table1 t1, Table2 t2
WHERE t2.Value <> -1
AND t2.ForeignKey = t1.Key;

我对LINQ还是很陌生,并且很难弄清楚该如何翻译。结果加权平均值应约为55.3。谢谢你。

最佳答案

我做了足够的工作,为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。允许用户捕获异常并根据需要进行处理。

关于c# - 用LINQ计算加权平均值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2714639/

10-12 23:13