我有一个数据表,包含几列.我想用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)
但更简单,更清洁.这正确地产生了平均值.
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>).
| 归档时间: |
|
| 查看次数: |
4402 次 |
| 最近记录: |