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

任何人都知道如何设置一个平均值的默认值?我有这样一条线
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.我认为这应该是一个扩展方法,我可以指定默认值应该是什么.

解决方法

有: DefaultIfEmpty.

我不知道你的DbVersions和DbRatings是什么,哪个集合完全有零个项目,但这是一个想法:

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

更新:(重复以下意见中的内容以提高可见度)

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

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

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

如果您不想/不能构造一个值等于0的默认项,则可以首先投影到一个int集合,然后提供一个默认值:

var avg = list.Select(item => item.Value).DefaultIfEmpty(0).Average();

相关文章

在项目中使用SharpZipLib压缩文件夹的时候,遇到如果目录较深,则压缩包中的文件夹同样比较深的问题。比...
项目需要,几十万张照片需要计算出每个照片的特征值(调用C++编写的DLL)。 业务流程:选择照片...
var array = new byte[4]; var i = Encoding.UTF8.GetBytes(100.ToString(&quot;x2&quot;));//...
其实很简单,因为Combox的Item是一个K/V的object,那么就可以把它的items转换成IEnumerable&lt;Dic...
把.net4.6安装包打包进安装程序。 关键脚本如下: 头部引用字符串对比库 !include &quot;WordFunc....
项目需求(Winform)可以批量打印某个模板,经过百度和摸索,使用iTextSharp+ZXing.NetʿreeSp...