Il mio obiettivo è ottenere una media ponderata da una tabella, basata su un'altra chiave primaria di tabelle.Calcolo della media ponderata con LINQ
Esempio Dati:
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
ho bisogno di ottenere una media ponderata in base alla lunghezza di un segmento e ho bisogno di ignorare i valori di -1 . So come farlo in SQL, ma il mio obiettivo è farlo in LINQ. Sembra qualcosa di simile 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;
Sono ancora abbastanza nuovo per LINQ, e avendo un periodo difficile capire come avrei tradurre questo testo. La media ponderata dei risultati dovrebbe attestarsi a circa 55,3. Grazie.
Grazie, molto utile. Finii per rendere questo un uno di linea ... pubblica float WeightedAverage static (questo IEnumerable articoli, Func valore, Func peso) { ritorno items.Sum (item => valore (voce) * Peso (articolo))/items.Sum (peso); } –
josefresno
Ho dovuto aggiungere "Se weightedSum.AlmostZero() restituisce 0" dopo i calcoli per proteggere dalla divisione per zero quando tutti i pesi e/o tutti i valori sono zero. AlmostZero è una funzione di estensione che verifica se un doppio è zero. – derdo