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

Rus*_*sby 18 .net c# sql linq average

有谁知道如何设置平均值的默认值?我有这样一条线......

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();
Run Code Online (Sandbox Code Playgroud)

由于我还没有收视率,因此会引发错误.如果我没有,我希望平均值默认为0.我认为这应该是一个扩展方法,我可以指定默认值应该是什么.

Jon*_*Jon 43

有:DefaultIfEmpty.

我不确定你DbVersions和你的DbRatings是什么以及哪个系列确实没有零件,但这是个主意:

var emptyCollection = new List<int>();
var average = emptyCollection.DefaultIfEmpty(0).Average();
Run Code Online (Sandbox Code Playgroud)

更新:(重复以下评论中所说的内容以提高可见性)

如果您发现自己需要DefaultIfEmpty在类类型集合上使用,请记住您可以聚合之前将LINQ查询更改为项目.例如:

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

var list = new List<Item>();
var avg = list.Average(item => item.Value);
Run Code Online (Sandbox Code Playgroud)

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

var avg = list.Select(item => item.Value).DefaultIfEmpty(0).Average();
Run Code Online (Sandbox Code Playgroud)

  • @DannyChen:不是这样的:`listofA.Select(a => a.Num).DefaultIfEmpty(0).Average()`. (2认同)
  • @DannyChen:为什么`x.DbRatings`可以是`null`?我当然希望它是一个空的“IQueryable&lt;DbRating&gt;”而不是“null”。 (2认同)