【问题标题】:Exchanging big lists between C# and F#在 C# 和 F# 之间交换大列表
【发布时间】:2012-12-19 13:30:15
【问题描述】:

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

列表是二维的,格式为

[[id, Open,High,Low,Close], [id, Open,High,Low,Close], ...]

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

建议的解决方案是:

  1. 在 C# 中存储 F# 列表,仅出于存储目的,因为库无法存储值,以及包含相同值的 C# 列表,根据需要转换部分列表。这里的主要问题是文件的大小可能是数 GB。

  2. 直接从 F# 文件中读取所需的值并将计算值保存在其他文件中。这里的问题是文件的有效组织,以便可以快速选择要加载的行(例如,用于移动平均计算)。

【问题讨论】:

  • 有关如何无法访问嵌套值的更多详细信息?是System.Generics.List<T>吗?
  • F# 可以很好地处理 C# 列表(例如,F# seq<T> 只是 IEnumerable<T> 的别名)。 C# 也可以使用 F# 列表,您只需要引用 FSharp.Core,然后您就可以使用 Microsoft.FSharp.Collections.ListModule.OfSeq()
  • C# 中的类型为System.Generics.List<System.Generics.List<Double>>,并作为IEnumerable 传递给F#。不是调用OfSeq() 转换列表值,迫使我循环遍历整个列表,在每个元素上调用OfSeq(),从而复制它。因为我有一个二维列表,所以这样做意味着我必须先转换列表,然后再单独转换每个元素。
  • 你能用Seq.cast吗?例如。 Seq.cast<List<Double>> enumerable(未经测试)
  • 有什么理由需要列表而不是数组吗? C# 数组也有完整的 F# 支持。

标签: c# list dll f# data-exchange


【解决方案1】:

内部序列是否需要是一个列表?如果它总是具有相同的元素(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

所以它只会向上转换,而不是复制。

【讨论】:

  • 我有一个小错误,现在正在使用元组。非常感谢!
【解决方案2】:

每次发生 F# 操作时都转换整个列表,成本太高。

你测量过吗?

这些值也不能存储在 F# 列表中,因为 C# 无法处理它们。

您应该能够从 C# 枚举 F# 列表的元素,因为它只是另一个可枚举的。

C# 中的类型是System.Generics.List&lt;System.Generics.List&lt;Double&gt;&gt;,并作为IEnumerable 传递给F#。不是调用 OfSeq() 转换列表值,迫使我循环遍历整个列表,在每个元素上调用 OfSeq() 并因此复制它。

调用 Array.ofSeq 之类的东西会创建一个新集合,但您不需要这样做来迭代内容。

请注意,您提供的类型的 F# 名称是 ResizeArray&lt;ResizeArray&lt;float&gt;&gt;

例如,你可以这样做:

let f (xss: ResizeArray<ResizeArray<float>>) =
  for xs in xss do
    for x in xs do
      printfn "%A" x

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-15
    • 1970-01-01
    • 1970-01-01
    • 2013-04-04
    • 2018-08-17
    • 1970-01-01
    • 2012-04-23
    • 2013-09-05
    相关资源
    最近更新 更多