如何使用linq获取列表中的列表平均值?

时间:2015-03-31 21:58:16

标签: c# linq average

我正在创建一个方法,该方法将获得最高平均评级的业务对象列表。该方法从一系列业务开始。每个业务都包含一个包含评级(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表达式正在做什么吗?

4 个答案:

答案 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

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