使用linq计算平均值而不进行分组

spe*_*i43 5 c# linq

我有一个数据表,包含几列.我想用linq计算这些的平均值,没有分组:我试过这个:

dtPointCollFb.GroupBy(r => 1).Select(r => new
        {
            Plus100 = r.Average(item => item.PLUS100),
            Plus50 = r.Average(item => item.PLUS50),
            Plus10 = r.Average(item => item.PLUS10),
            Plus5 = r.Average(item => item.PLUS5),
            Plus1 = r.Average(item => item.PLUS1),
            NULLA = r.Average(item => item.NULLA)
        }).ToList()
Run Code Online (Sandbox Code Playgroud)

当我计算Sum时,这非常有效,但是平均值会产生第一个记录值,而不是所有记录的平均值.我认为这是不必要的:.GroupBy(r => 1)因为我正在使用常量分组.

但是如果没有这个,我不能仅对整个查询使用平均值,而且只能用于一列:

dtPointCollFb.Average(r => r.PLUS100)
Run Code Online (Sandbox Code Playgroud)

有人可以制作简单的最佳实践解决方案吗?如果可以使用方法语法,而不是查询.

我想要这样的东西:

dtPointCollFb.GroupBy(r => 0).Select(r => new
        {
            Plus100 = r.Sum(item => item.PLUS100) / dtPointCollFb.Rows.Count,
            Plus50 = r.Sum(item => item.PLUS50) / dtPointCollFb.Rows.Count,
            Plus10 = r.Sum(item => item.PLUS10) / dtPointCollFb.Rows.Count,
            Plus5 = r.Sum(item => item.PLUS5) / dtPointCollFb.Rows.Count,
            Plus1 = r.Sum(item => item.PLUS1) / dtPointCollFb.Rows.Count,
            NULLA = r.Sum(item => item.NULLA) / dtPointCollFb.Rows.Count
        }).ToList()
Run Code Online (Sandbox Code Playgroud)

但更简单,更清洁.这正确地产生了平均值.

Chr*_*son 6

Enumerable.Average计算一系列数字的平均值.因此,您需要为您需要的每个平均值投影(即选择)一列.

dtPointCollFb.Select(r => r.PLUS100).Average()
Run Code Online (Sandbox Code Playgroud)

要么

dtPointCollFb.Average(r => r.PLUS100)    
Run Code Online (Sandbox Code Playgroud)

GroupBy构建列表列表.在这种情况下,(外部)列表具有一个元素.(因为你对原始列表中的所有元素任意使用相同的键)

所以你上面的内容可以很容易地写成:

var averages = new
{
    Plus100 = dtPointCollFb.Average(item => item.PLUS100),
    Plus50 = dtPointCollFb.Average(item => item.PLUS50),
    Plus10 = dtPointCollFb.Average(item => item.PLUS10),
    Plus5 = dtPointCollFb.Average(item => item.PLUS5),
    Plus1 = dtPointCollFb.Average(item => item.PLUS1),
    NULLA = dtPointCollFb.Average(item => item.NULLA)
};
Run Code Online (Sandbox Code Playgroud)

做更多的事情需要定制的扩展功能(扩展IEnumerable<DataTableClass>).