Mi objetivo es obtener un promedio ponderado de una tabla, basado en otra clave principal de tablas.Cálculo del promedio ponderado con LINQ
Ejemplo de datos:
Tabla1
Key WEIGHTED_AVERAGE
0200 0
Tabla2
ForeignKey Length Value
0200 105 52
0200 105 60
0200 105 54
0200 105 -1
0200 47 55
que necesito para obtener una media ponderada en base a la longitud de un segmento y necesito ignorar los valores de -1 . Sé cómo hacer esto en SQL, pero mi objetivo es hacer esto en LINQ. Se ve algo como esto en 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;
todavía soy bastante nuevo en LINQ, y tener un tiempo difícil averiguar cómo iba a traducir esto. El promedio ponderado de resultados debería llegar a aproximadamente 55.3. Gracias.
Gracias, muy útil. Acabé haciendo de este un un trazador de líneas ... flotación pública WeightedAverage estática (IEnumerable esta artículos, Func valor, Func peso) { retorno items.Sum (item => valor (elemento) * Peso (punto))/items.Sum (peso); } –
josefresno
Tuve que agregar "If weightedSum.AlmostZero() return 0" después de los cálculos para proteger contra la división por cero cuando todos los pesos y/o todos los valores son cero. AlmostZero es una función de extensión que comprueba si un doble es cero. – derdo