假设我已经按日期(此处未显示)对数字列表进行了排序:
5, 7, 10, 4, 3, 7, 4
我想要求增长的平均值,即从5到7、从7到10和从3到7的平均增长率为(2+3+5)/3。
我还想要求减少的平均值,即从10到4、从4到3和从7到4的平均减少率为(6+1+3)/3。
在Linq中有简单的方法吗?
首先我会计算两个相邻数字之间的变化。可以通过跳过第一个项目,使用同一列表的Enumerable.Zip
来实现。然后您可以获取向上移动的更改或向下移动的更改,并计算它们的平均值:
var changes = list.Zip(list.Skip(1), (x,y) => y-x); // [ 2, 3, -6, -1, 4, -3 ]
var averageUp = changes.Where(x => x > 0).Average(); // 3
var averageDown = changes.Where(x => x < 0).Average(); // -3.33