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 關注
- 130 瀏覽
添加回答
舉報