gpt4 book ai didi

.net - 递归序列生成

转载 作者:行者123 更新时间:2023-12-01 07:44:55 30 4
gpt4 key购买 nike

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

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/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com