使用 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
给定一个 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