c#排序列表基于嵌套列表值与lambda表达式的平均值

本文关键字:列表 lambda 平均值 表达式 嵌套 排序 于嵌套 | 更新日期: 2023-09-27 17:54:11

我想知道是否可以使用lambda表达式根据嵌套项列表的平均值对项列表进行排序。

在项目术语中,我有一个产品列表,每个产品可以有许多评论。我想根据每个产品的评论列表中的平均评分对产品列表进行排序。

我有这个:

products = category.Products.OrderBy(i => i.Reviews.Average(x => x.Rating));

这没有问题,但当我运行它时,它返回一个错误,说

序列不包含元素

有可能用lambda表达式做到这一点吗?

c#排序列表基于嵌套列表值与lambda表达式的平均值

Enumerable.Average抛出InvalidOperationException,因为序列不包含任何元素,因为乘积不包含Reviews

您可以使用Enumerable.DefaultIfEmpty(customValue):

products = category.Products
    .OrderBy(i => i.Reviews.Select(r => r.Rating).DefaultIfEmpty(0).Average());

也许你想从结果中排除这些产品:

products = category.Products
    .Where(p => p.Reviews.Any())
    .OrderBy(p => p.Reviews.Average(r => r.Rating));

您的某个产品可能没有评论。你应该决定给它什么评级,比如99,因为你想让它出现在最后,所以:

category.Products.OrderBy(p=>p.Reviews.Count > 0 ?
                          p.Reviews.Average(r=>r.Rating) : 99);