2014-01-07 143 views
1

我有一個數組評分,其中評級[i] = j意味着有j個評級的i,其中i在1和10之間。我如何使用linq來計算平均評級?使用Linq來計算C#中的評級平均數

for (int i = 1; i <= 10;i++) 
      { 
       sum += i * ratings[i]; 
       nr += ratings[i]; 
      } 
ratingAvg = sum/nr; 

如果我使用ratings.Sum()/ratings.Count()它不會做我想要的。我需要做些類似ratings.Sum(w => index_of_w_in_the_array * w.value).

回答

4

有幾種方法使用Select涉及到每一個等級的計算指標要做到這一點,例如:

var average = ratings.Select((r, n) => r * n).Sum()/ratings.Sum(); 

如果收視率本身是整數,則需要將上面的一邊加上double,這樣就不會得到整數除法。

+0

正是我在找的東西。謝謝! – Adrian

0

ratings.Sum()/ratings.Count()應該工作。如果沒有,你需要比「不做我想做的事」更詳細。

而且,如果這些方法都失敗,請嘗試:

ratings.Average(); 
1

只需保持一個運行總數和一個項目的運行計數。對於列表中的每個項目添加到總數,並添加到正在運行的總和基於該值乘以值本身的計數:

int sum = 0; 
int count = 0; 
for(int i = 0; i < array.Length; i++) 
{ 
    sum += array[i] * i; 
    count += array[i]; 
} 
double average = sum/(double)count; 

這裏是一個LINQ的解決方案,這看起來不錯,但效率會比較低:

var average = array.SelectMany((n, i) => Enumerable.Repeat(n, i)) 
    .Average();