3 回答

TA贡献1788条经验 获得超4个赞
你可以在 Linq 中使用它:
var m = Enumerable.Range(1, dailyCloseList.Count - 1) .Select(i => (dailyCloseList[i] - dailyCloseList[i - 1])/ dailyCloseList[i - 1]) .ToList();
检查异常总是有帮助的。DivideByZero

TA贡献1813条经验 获得超2个赞
另一种选择是使用:Zip
var change = dailyCloseList.Zip(dailyCloseList.Skip(1)) .Select((x,y) => (y - x)/x) .ToList();

TA贡献1843条经验 获得超7个赞
我认为最林克的方式是这个
var dailyRetList = dailyCloseList
.ConsecutivePairs((a, b) => (b - a) / a)
.ToList();
当然,你必须定义函数(曾经在某个地方)。但与 Guaravsa 解决方案不同,它适用于 ,因此不需要直接索引访问。但这一切都是有代价的。您最初的简单循环比任何使用枚举的解决方案快3倍左右(顺便说一句,您应该在开始时预先分配List以获得最佳性能)。ConsecutivePairsIEnumerable
函数实现,只是为了完整性:
public static IEnumerable<Q> ConsecutivePairs<T, Q>(this IEnumerable<T> sequence, Func<T, T, Q> selector)
{
using(var en = sequence.GetEnumerator())
{
if (!en.MoveNext()) { yield break; }
T prev = en.Current;
while (en.MoveNext())
{
yield return selector(prev, en.Current);
prev = en.Current;
}
}
}
- 3 回答
- 0 关注
- 131 浏览
添加回答
举报