我有历史股票数据的大数据文件,我想通过一个C#图形用户界面加载这些数据文件,然后在F#中使用不同的算法进行处理。随着时间的推移,附加值会附加到列表中。
这些列表是二维的,并且是形式上的。
[[id, Open,High,Low,Close], [id, Open,High,Low,Close], ...]F#代码位于库中,不能使用C#列表(我无法在F#中获取列表的第二个维度的值)。每次发生F#操作时都要转换整个列表,这太昂贵了。这些值也不能存储在F#列表中,因为C#无法处理它们。
拟议的解决办法是:
发布于 2012-12-19 15:17:49
内部序列需要是一个列表吗?如果它总是具有相同的元素(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所以它只是颠倒,而不是复制。
发布于 2012-12-22 23:31:14
每次发生F#操作时都要转换整个列表,这太昂贵了。
你量过了吗?
这些值也不能存储在F#列表中,因为C#无法处理它们。
您应该能够从F#列表中枚举来自C#的元素,因为它只是另一个可枚举的元素。
C#中的类型是
System.Generics.List<System.Generics.List<Double>>,作为IEnumerable传递给F#。不是调用OfSeq()转换列表值,迫使我循环遍历整个列表,调用每个元素上的OfSeq(),从而复制它。
调用类似Array.ofSeq的内容将创建一个新集合,但是您不需要这样做就可以迭代内容。
注意,您给出的类型的F#名称是ResizeArray<ResizeArray<float>>。
例如,您可以:
let f (xss: ResizeArray<ResizeArray<float>>) =
for xs in xss do
for x in xs do
printfn "%A" x在不复制的情况下使用F#中的数据。
https://stackoverflow.com/questions/13953488
复制相似问题