F#array_chunk的序列 [英] F# array_chunk for Sequence

查看:161
本文介绍了F#array_chunk的序列的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一些麻烦让一序列。基本上,我想切序列到阵列的序列。 Seq.windowed几乎不会,但我不想重复的元素。

我能得到我想要的东西通过先读一切到一个数组,但我宁愿使用的序列。

 让array_chunk S(一:INT [])=
    Array.init(则为a.length /秒)(我的乐趣 - > Array.sub A(I * S)S)someSequence |> Seq.to_array |> array_chunk 5


解决方案

下面是一个不错的当务之急一个会与序列工作,并生成任意大小的数组。最后一个将是较小的,如果该序列是不连以n

 让段N = XS序列{
    让我= REF 0
    让ARR = REF< | Array.create N(Unchecked.defaultof<'A>)
    在XS X千万
        如果!我= N则
            屈服!ARR
            ARR:= Array.create N(Unchecked.defaultof<'A>)
            I:= 0
        (!ARR)。[!1] - ; - X
        I:= I + 1!
    如果我<!> 0,则
        产量(!ARR)。[0 ..!I-1]}

I'm having some trouble making a sequence. Basically I need to chop a sequence into a sequence of arrays. Seq.windowed almost does it but I don't want duplicate elements.

I can get what I want by reading everything into an array first but I'd rather use a sequence.

let array_chunk s (a:int[]) =
    Array.init (a.Length / s) (fun i -> Array.sub a (i * s) s)

someSequence |> Seq.to_array |> array_chunk 5

解决方案

Here's a nice imperative one that'll work with seq and generate arrays of any size. The last one will be smaller if the sequence isn't even by n.

let chunk n xs = seq {
    let i = ref 0
    let arr = ref <| Array.create n (Unchecked.defaultof<'a>)
    for x in xs do
        if !i = n then 
            yield !arr
            arr := Array.create n (Unchecked.defaultof<'a>)
            i := 0 
        (!arr).[!i] <- x
        i := !i + 1
    if !i <> 0 then
        yield (!arr).[0..!i-1] }

这篇关于F#array_chunk的序列的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆