gpt4 book ai didi

c# - 使用 LINQ 计算加权平均值

转载 作者:IT王子 更新时间:2023-10-29 04:40:39 26 4
gpt4 key购买 nike

我的目标是根据另一个表的主键从一个表中获取加权平均值。

示例数据:

表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)
{
if(records == null)
throw new ArgumentNullException(nameof(records), $"{nameof(records)} is null.");

int count = 0;
double valueSum = 0;
double weightSum = 0;

foreach (var record in records)
{
count++;
double recordWeight = weight(record);

valueSum += value(record) * recordWeight;
weightSum += recordWeight;
}

if (count == 0)
throw new ArgumentException($"{nameof(records)} is empty.");

if (count == 1)
return value(records.Single());

if (weightSum != 0)
return valueSum / weightSum;
else
throw new DivideByZeroException($"Division of {valueSum} by zero.");
}

这变得非常方便,因为我可以根据同一记录中的另一个字段获得任何一组数据的加权平均值。

更新

我现在检查除以零并抛出更详细的异常而不是返回 0。允许用户捕获异常并根据需要进行处理。

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com