使用 LINQ 返回 IList<T> 的 IList<T> 的百分比变化

Percent change of a IList<T> returning IList<T> using LINQ

给定一个 List<T>,其中 T 是 float/decimal/double,使用 LINQ,计算所有值的 percent change

这是 PercentChange 的定义(没有 error 检查例如 a 是否为 zero

static double PercentChange(double a, double b)
{
    double result = 0;
    result = (b - a) / a;
 
    return result;
}

var list = new List<double>();
list.Add(2.0);
list.Add(2.5);
list.Add(2.0);
list.Add(1.75);

然后使用 LINQ 将 return 一个新列表少一个元素,其值:

[.25, -.20, -.125] 

我知道我可以 loop。我想要一个使用 LINQ.

functional 版本

我不确定我会发现这种方法比循环更具可读性,但 LINQ 方法是:

list.Zip(list.Skip(1), PercentChange)

输出:

[.25, -.2, -.125]

想法是获取第一个列表,将其与自身“压缩”,但跳过第一个元素(因此 y 是下一个元素)并在其上应用 PercentChange 函数。 Zip 会自动将生成的序列截断为较小序列的大小,因此您最终会得到三个元素。

有几种解决方案,我更喜欢下面一种,结合LINQs Enumerable.Zip with LINQS Enumerable.Skip

var result = list.Zip(list.Skip(1), (a, b) => (b - a) / a);
Console.WriteLine(string.Join(", ", result));

打印

0.25, -0.2, -0.125

这个非常紧凑的解决方案允许计算您的列表,如下所示:

a:    2.0        2.5        2.0       1.75
b:    2.5        2.0        1.75
res:  0.25      -0.2       -0.125