F#将序列拆分为每个第n个元素的子列表

yan*_*nta 10 f#

说我有100个元素的序列.每10个元素我想要一个前10个元素的新列表.在这种情况下,我将得到10个子列表的列表.

Seq.take(10)看起来很有希望,我怎样才能反复调用它来返回列表清单?

anv*_*ish 14

现在有Seq.chunkBySize:

[1;2;3;4;5] |> Seq.chunkBySize 2 = seq [[|1; 2|]; [|3; 4|]; [|5|]]
Run Code Online (Sandbox Code Playgroud)


Bri*_*ian 7

这不错:

let splitEach n s =
    seq {
        let r = ResizeArray<_>()
        for x in s do
            r.Add(x)
            if r.Count = n then
                yield r.ToArray()
                r.Clear()
        if r.Count <> 0 then
            yield r.ToArray()
    }

let s = splitEach 5 [1..17]
for a in s do
    printfn "%A" a
(*
[|1; 2; 3; 4; 5|]
[|6; 7; 8; 9; 10|]
[|11; 12; 13; 14; 15|]
[|16; 17|]
*)
Run Code Online (Sandbox Code Playgroud)

  • 作为次要优化,您可以将`n`传递给ResizeArray构造函数,将初始容量设置为您知道它需要保持的容量. (2认同)