.net - 递归序列生成

标签 .net recursion f#

我正在尝试通过从我的数据源中递归读取数据来生成一系列切片。

let rec read stream startFrom (conn : IEventStoreConnection) = 
    seq {
        let size = 10000
        let slice = conn.ReadStreamEventsForwardAsync(stream, startFrom, size, true).Result

        Console.WriteLine("Events in slice: " + slice.Events.Count().ToString())

        if (slice.IsEndOfStream) then
           yield slice
        else
           yield! read stream (startFrom + 1 * size) conn 
    }

let slices = read "stream-name" 0 conn

Console.WriteLine("TOTAL slices in sequence: " + (Seq.length slices).ToString());

我原以为该序列包含三项,但它似乎只返回一项,即最后一项。

Events in slice: 10000
Events in slice: 10000
Events in slice: 4501
TOTAL slices in sequence: 1

为什么我的递归调用的结果也没有产生?范围界定?

最佳答案

正如 John 已经告诉您的,您还必须 yield 其他切片:

let rec read stream startFrom (conn : IEventStoreConnection) = 
    seq {
        let size = 10000
        let slice = conn.ReadStreamEventsForwardAsync(stream, startFrom, size, true).Result

        Console.WriteLine("Events in slice: " + slice.Events.Count().ToString())

        if (slice.IsEndOfStream) 
        then
           yield slice
        else
           yield slice // here
           yield! read stream (startFrom + 1 * size) conn 
    }

我认为您可以使用内部函数稍微清理一下:

let read (conn : IEventStoreConnection) stream startFrom = 
    let size = 10000
    let rec loop startFrom =
       seq {
           let slice = conn.ReadStreamEventsForwardAsync(stream, startFrom, size, true).Result

           Console.WriteLine("Events in slice: " + slice.Events.Count().ToString())

           if (slice.IsEndOfStream) 
           then
              yield slice
           else
              yield slice // here
              yield! loop (startFrom + 1 * size)
       }
    loop startFrom

关于.net - 递归序列生成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26202165/

相关文章:

python - 网页抓取 : Expand/contract bounding box depending on results

clojure - F#:类似于 Clojure 中的分区函数

.net - 从 Entity Framework 元数据获取数据库表名称

.net - 如何使用 silverlight 3 DataGrid 插入新行(而不使用 DataForm)?

c# - 当我试图关闭它时 Winform 卡住

c - 理解递归如何在 C 中工作的问题

c# - 将值设置为属性时出现 NullReferenceException

unix - 目录递归

jenkins - 使用 --targetprofile 参数调用 F# 编译器的 Jenkins 构建错误

c# - F# 动态对象访问