F# 序列一次返回一个项目

F# sequences returning one item at a time

我是 F# 的新手,我正在尝试将 DbDataReader class 从 C# 转换为 F#,DBDataReader 读取 returns 一个 csv 行作为列表

member this.ReadCSV = 
    seq { 
        use textReader = File.OpenText(filename)
        while (not textReader.EndOfStream) do
            let line = textReader.ReadLine()
            // linedata is a class variable that holds the current data for use by DBDataReader
            linedata <- line |> Seq.toList |> splitDelimited delimiter "" [])
            yield true
        yield false
    }

DBDataReader class 有一个 Read() 函数,调用时应将光标移动到输入中的下一行,我使用索引变量实现了它,如下所示,但这在处理文件时似乎效率低下有数百万行。有更有效的方法吗?

override this.Read() =
    let hasRows = Seq.item idx this.ReadCSV
    idx <- idx + 1
    hasRows

为什么不使用枚举器而不是序列?

如果你真的想使用 FP 风格的序列,那么

  1. 序列中的收益选项值和
  2. 将使用 this.Read() 方法的循环语句替换为使用 this.ReadCSV 作为可枚举表达式和
  3. 的 for..in 表达式
member this.CSV = 
    seq { 
        use textReader = File.OpenText(filename)
        while (not textReader.EndOfStream) do
            let line = textReader.ReadLine()
            yield (line |> Seq.toList |> splitDelimited delimiter "" [])
    }


for linedata in this.CSV do
    ...