Mein Ziel ist es, einen gewichteten Durchschnitt aus einer Tabelle basierend auf einem anderen Tabellenprimärschlüssel zu erhalten.Berechnen des gewichteten Durchschnitts mit LINQ
Beispieldaten:
Table1
Key WEIGHTED_AVERAGE
0200 0
Table2
ForeignKey Length Value
0200 105 52
0200 105 60
0200 105 54
0200 105 -1
0200 47 55
Ich brauche einen gewichteten Mittelwert zu erhalten, basierend auf der Länge eines Segments und ich brauche zu ignorieren Werte von -1 . Ich weiß, wie man das in SQL macht, aber mein Ziel ist, dies in LINQ zu tun. Es sieht so etwas wie dies in 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;
Ich bin immer noch ziemlich neu in LINQ, und eine harte Zeit, herauszufinden, wie ich das übersetzen würde. Der ergebnisgewichtete Durchschnitt sollte bei etwa 55,3 liegen. Vielen Dank.
Danke, sehr hilfreich. Ich zog so dass dies ein Einzeiler ... public static float WeightedAverage (diese IEnumerable Artikel, Func Wert, Func Gewicht) { return items.Sum (item => Wert (Artikel) * Gewicht (Artikel))/items.Sum (Gewicht); } –
josefresno
Ich musste hinzufügen "Wenn WeightedSum.AlmostZero() 0 zurückgeben" nach den Berechnungen zum Schutz vor Division durch Null, wenn alle Gewichte und oder alle Werte Null sind. AlmostZero ist eine Erweiterungsfunktion, die prüft, ob ein Double gleich Null ist. – derdo