我有历史股票数据的大数据文件,我想通过 C# GUI 加载该文件,然后在 F# 中使用不同的算法进行处理。随着时间的推移,其他值会附加到列表中。
列表是二维的并且采用以下形式
[[id, Open,High,Low,Close], [id, Open,High,Low,Close], ...]
F# 代码位于库中,无法使用 C# 列表(我无法获取 F# 中列表第二维的值)。每次发生 F# 操作时转换整个列表的成本太高。这些值也不能存储在 F# 列表中,因为 C# 无法处理它们。
建议的解决方案是:
在 C# 中存储 F# 列表(仅出于存储目的,因为库无法存储值)以及包含相同值的 C# 列表,并根据需要转换列表的部分内容。这里的主要问题是文件大小可能有多个 GB。
直接从 F# 中的文件读取所需的值并将计算值保存在其他文件中。这里的问题是文件的有效组织,以便可以快速完成要加载的行选择(例如用于移动平均计算)。
最佳答案
内部序列必须是列表吗?如果它总是具有相同的元素(OHLC),那么最好使用元组(或自定义类型),因为它明确了其固定性质。我可能会做这样的事情:
module Stock =
let (!) s = DateTime.Parse(s)
let getOHLC() : unit -> seq<DateTime * float * float * float * float> =
seq [
!"18-Dec-12",27.25,27.63,27.14,27.56
!"17-Dec-12",26.79,27.22,26.68,27.10
!"14-Dec-12",27.11,27.13,26.70,26.81
//...
]
如果你确实需要每个元素都是一个列表,你可以通过Seq.map seq
进行管道传输。
seq
函数定义为:
let seq (x:seq<'T>) = x
所以它只向上转换,而不复制。
关于c# - 在 C# 和 F# 之间交换大列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13953488/