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

标签 c# list dll f# data-exchange

我有历史股票数据的大数据文件,我想通过 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# 中的文件读取所需的值并将计算值保存在其他文件中。这里的问题是文件的有效组织,以便可以快速完成要加载的行选择(例如用于移动平均计算)。

最佳答案

内部序列必须是列表吗?如果它总是具有相同的元素(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/

相关文章:

c# - 无法创建互斥量。网络

android - 如何将对象列表写入 firebase?

python - 根据最大值的长度从 python 嵌套字典中查找项目?

java - 如何从列表中删除对象

c# - 添加 .dll 作为引用。无法理解错误消息

c# - Visual Studio 2012 Express for Web 不运行单元测试

c# - 1607更新后,我应该选择哪种背景音乐播放策略?

c++ - 在 MinGW 构建的项目中链接 MSVC 编译的 DLL

c# - 在 C# dockerfile 中运行可执行文件

c# - 将错误消息从 C# DLL 返回到 C# 程序?