使用 Linq 进行元素比较和分配

3
假设我已经按日期(此处未显示)对数字列表进行了排序:
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中有简单的方法吗?


假设数字已经排序并按一定顺序排列。逻辑是将序列上升的次数与序列数字下降的次数分开,然后取平均值(问题的第二段中有示例)。 - Qash
1个回答

15

首先我会计算两个相邻数字之间的变化。可以通过跳过第一个项目,使用同一列表的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

6
非常聪明的解决方案! - MarcinJuraszek
1
我不知道Zip存在。谢谢! - Qash
1
将一个集合与它的尾部压缩在一起,我看你对函数式编程很有兴趣 :) - dcastro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接