如何使用 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>,即平均数最高的企业。