2014-01-07 71 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();