我正在创建一个方法,该方法将获得最高平均评级的业务对象列表。该方法从一系列业务开始。每个业务都包含一个包含评级(int)的审阅对象列表。
举例说明:
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 :(得分: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());
这是你正在寻找的吗?我可以提供进一步的解释,但我想确定这是你所追求的。
答案 1 :(得分: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>
,即与最高平均值相关的业务。
答案 2 :(得分:0)
您可以使用LINQ语句提取评级列表,然后调用该列表中的Average
函数:
var average = (
from r in reviews
select r.getRateing()
).Average();
答案 3 :(得分:0)
我已经测试了我在更新中添加的解决方案:
double average = busInCat.Max(b=> b.GetReviews().Average(r => r.getRateing()));
return busInCat.Where(b => b.GetReviews().Average(r => r.getRateing()) == average).T
上面的代码确实按预期工作。