一尘不染

Linq中默认值的平均扩展方法

sql

有人知道如何为平均值设置默认值吗?我有这样一条线…

dbPlugins = (from p in dbPlugins
                select new { Plugin = p, AvgScore = p.DbVersions.Average(x => x.DbRatings.Average(y => y.Score)) })
            .OrderByDescending(x => x.AvgScore)
            .Select(x => x.Plugin).ToList();

如果我还没有评级,这会引发错误。如果没有,我希望平均值默认为0。我想这应该是一种扩展方法,我可以在其中指定默认值。


阅读 143

收藏
2021-05-16

共1个答案

一尘不染

有:DefaultIfEmpty

我不确定您是什么DbVersionsDbRatings以及哪个集合恰好有零个项目,但这就是这个主意:

var emptyCollection = new List<int>();
var average = emptyCollection.DefaultIfEmpty(0).Average();

更新:( 重复以下评论中的内容以提高知名度)

如果发现自己需要使用DefaultIfEmpty类类型的集合,请记住,可以 聚合 之前 将LINQ查询更改为project 。例如:

class Item
{
    public int Value { get; set; }
}

var list = new List<Item>();
var avg = list.Average(item => item.Value);

如果你不想/无法构造一个默认的ItemValue等于0,则可以投射到集合int的第一个和 然后 提供一个默认的:

var avg = list.Select(item => item.Value).DefaultIfEmpty(0).Average();
2021-05-16