如何使用 linq 获取列表中列表的平均值?
How to get average of list within lists using linq?
我正在创建一个方法,该方法将获取与最高平均评级相关的业务对象列表。该方法以企业列表开始。每个企业都包含一个包含评级 (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();
如果上面的代码是正确的,那么它首先会在第一行找到评分的最大平均值。
然后在第二行 returns 列出具有该平均评级的企业。任何人都可以确认这是 linq 表达式在做什么吗?
您可以使用 LINQ 语句提取评级列表,然后对该列表调用 Average
函数:
var average = (
from r in reviews
select r.getRateing()
).Average();
我不太明白你在这里找什么,但我猜猜看。
你有一个 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());
这是您要找的吗?我可以提供进一步的解释,但我想确定这就是您想要的。
我测试了更新中的解决方案:
double average = busInCat.Max(b=> b.GetReviews().Average(r => r.getRateing()));
return busInCat.Where(b => b.GetReviews().Average(r => r.getRateing()) == average).T
以上代码确实按预期工作。
有一种方法可以在一条语句中做到这一点:
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>
,即平均数最高的企业。
我正在创建一个方法,该方法将获取与最高平均评级相关的业务对象列表。该方法以企业列表开始。每个企业都包含一个包含评级 (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();
如果上面的代码是正确的,那么它首先会在第一行找到评分的最大平均值。
然后在第二行 returns 列出具有该平均评级的企业。任何人都可以确认这是 linq 表达式在做什么吗?
您可以使用 LINQ 语句提取评级列表,然后对该列表调用 Average
函数:
var average = (
from r in reviews
select r.getRateing()
).Average();
我不太明白你在这里找什么,但我猜猜看。
你有一个 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());
这是您要找的吗?我可以提供进一步的解释,但我想确定这就是您想要的。
我测试了更新中的解决方案:
double average = busInCat.Max(b=> b.GetReviews().Average(r => r.getRateing()));
return busInCat.Where(b => b.GetReviews().Average(r => r.getRateing()) == average).T
以上代码确实按预期工作。
有一种方法可以在一条语句中做到这一点:
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>
,即平均数最高的企业。