2015-03-31 163 views
1

我正在创建一个方法,该方法将获得最高平均评级的业务对象列表。该方法以商业清单开始。每个业务都包含一个包含评级(int)的评论对象列表。如何使用linq获取列表中列表的平均值?

举例说明:

list<Review> reviews = curtBusiness.getReviews(); 
reviews[1].GetRating(); 

使用for循环,我可以很容易地找到它,然而不幸的是,我需要使用LINQ,东西我几乎没有任何技能。

任何人都可以帮我做这个查询或类似的查询LINQ语句?

更新:

我想我可能已经偶然到一个解决方案

double average = busInCat.Max(b=> b.GetReviews().Average(r => r.getRateing())); 
     return busInCat.Where(b => b.GetReviews().Average(r => r.getRateing()) == average).ToList(); 

如果上面的代码是正确的,那么它首先找到收视率的最高平均在第一线。

然后在第二行中返回具有该平均评级的企业列表。任何人都可以证实这是linq表达式在做什么?

+0

small nit-pick:'getRateing'应该拼写成'getRating',并且由于它是一种方法,所以应该是PascalCase:'GetRating' ... – 2015-03-31 22:15:31

+0

不用担心我的拼写是令人遗憾的。 – Noob 2015-03-31 22:16:35

回答

0

我已经测试我把更新的解决方案:

double average = busInCat.Max(b=> b.GetReviews().Average(r => r.getRateing())); 
return busInCat.Where(b => b.GetReviews().Average(r => r.getRateing()) == average).T 

如预期上面的代码确实工作。

0

您可以使用LINQ语句来提取评级的列表中,然后调用这个名单上的Average功能:

var average = (
    from r in reviews 
    select r.getRateing() 
    ).Average(); 
1

我不太明白你在找什么在这里,但我我会猜测。

你有一个Review对象,有像int getRating()的方法,你有这些对象的列表,你想找到的收视率

像这样的平均会做的伎俩

// get your reviews 
var reviews = curtBusiness.getReviews(); 

// get the average of the getRating() results of the reviews 
var average = reviews.Average(r => r.getRating()); 

这是你在找什么?我可以提供进一步的解释,但我想确定这就是你要做的。

+0

对不起,模糊不清。我已经用我认为是解决方案的问题更新了这个问题。如果是的话,它应该阐明我正在努力做的事情。 – Noob 2015-03-31 22:13:34

1

有一种方法在一个语句来做到这一点:

busInCat.Select(b => new { b, Avg = b.GetReviews().Average(r => r.GetRating()) }) 
     .GroupBy(x => x.Avg, x => x.b) 
     .OrderByDescending(g => g.Key) 
     .FirstOrDefault(); 

此先建立一个企业和他们的平均名单。然后它按照平均值进行分组,按照它们的密钥的降序(平均值)对组进行排序并获取第一组。该组是IEnumerable<Business>,即平均数最高的企业。