首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在C#和F#之间交换大列表

在C#和F#之间交换大列表
EN

Stack Overflow用户
提问于 2012-12-19 13:30:15
回答 2查看 811关注 0票数 2

我有历史股票数据的大数据文件,我想通过一个C#图形用户界面加载这些数据文件,然后在F#中使用不同的算法进行处理。随着时间的推移,附加值会附加到列表中。

这些列表是二维的,并且是形式上的。

代码语言:javascript
运行
复制
[[id, Open,High,Low,Close], [id, Open,High,Low,Close], ...]

F#代码位于库中,不能使用C#列表(我无法在F#中获取列表的第二个维度的值)。每次发生F#操作时都要转换整个列表,这太昂贵了。这些值也不能存储在F#列表中,因为C#无法处理它们。

拟议的解决办法是:

  1. 要么将F#列表存储在C#中,只是为了存储目的,因为库不能存储值,以及包含相同值的C#列表,可以根据需要转换列表的部分内容。这里的主要问题是文件的大小可以是多个GB。
  2. 从F#中的文件中直接读取所需的值,并将计算值保存在其他文件中。这里的问题是文件的有效组织,以便能够快速地完成选定的行(例如,移动平均计算)的加载。
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-12-19 15:17:49

内部序列需要是一个列表吗?如果它总是具有相同的元素(OHLC),那么最好使用一个元组(或自定义类型),因为它明确了它的固定性质。我可能会这样做:

代码语言:javascript
运行
复制
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函数定义为:

代码语言:javascript
运行
复制
let seq (x:seq<'T>) = x

所以它只是颠倒,而不是复制。

票数 3
EN

Stack Overflow用户

发布于 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>>

例如,您可以:

代码语言:javascript
运行
复制
let f (xss: ResizeArray<ResizeArray<float>>) =
  for xs in xss do
    for x in xs do
      printfn "%A" x

在不复制的情况下使用F#中的数据。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13953488

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档