F# 将项的序列分块(或分割)为N个项的序列
如何实现F#序列的分块(或分区)功能?我正在寻找一个具有此签名的函数F# 将项的序列分块(或分割)为N个项的序列,f#,F#,如何实现F#序列的分块(或分区)功能?我正在寻找一个具有此签名的函数 val toChunks : n:int -> sequence:seq<'T> -> seq<seq<'T>> 内森·埃文斯建议: ///返回产生长度为n的块的序列。 让我们来看看下面的例子 对于s中的x 缓冲区。[!pos]Array.copy 位置:=0 其他的 增量位置 如果!pos>0,则 产生数组.sub缓冲区0!位置 } 对我来说,这似乎是最好的方法,但我对其他
val toChunks : n:int -> sequence:seq<'T> -> seq<seq<'T>>
内森·埃文斯建议:
///返回产生长度为n的块的序列。
让我们来看看下面的例子
对于s中的x
缓冲区。[!pos]Array.copy
位置:=0
其他的
增量位置
如果!pos>0,则
产生数组.sub缓冲区0!位置
}
对我来说,这似乎是最好的方法,但我对其他解决方案感兴趣。很高兴能提供帮助:)你说得对。。。我的搜索词找不到类似的问题。
[1; 2; 3; 4; 5; 6; 7; 8; 9]
|> toChunks 4
|> Seq.iter (printfn "%A")
seq [1; 2; 3; 4]
seq [5; 6; 7; 8]
seq [9]
/// Returns a sequence that yields chunks of length n.
let toChunks n (s:seq<'t>) = seq {
let pos = ref 0
let buffer = Array.zeroCreate<'t> n
for x in s do
buffer.[!pos] <- x
if !pos = n - 1 then
yield buffer |> Array.copy
pos := 0
else
incr pos
if !pos > 0 then
yield Array.sub buffer 0 !pos
}