FSharp创建一个部分填充的字节数组

时间:2014-08-20 20:38:11

标签: f#

我有以下C#代码:

    this.UP = new byte[10];
    this.UP[1] = 2;
    this.UP[2] = 2;

我正在尝试将其移植到F#。我已经阅读了this帖子,可以使用Array.ZeroCreate进行,然后改变第一个字节,但我希望以更惯用的方式进行。到目前为止我已经这样做了:

member this.UP = [|byte(2);byte(2);|]

有没有办法用空字节初始化数组的其余部分?

3 个答案:

答案 0 :(得分:4)

这显然对你的例子过于具体,但它应该指向正确的方向:

let xs = Array.init 10 (fun i -> if i < 2 then 2 else 0)

例如,如果您从较小的数组进行复制,则可以执行此操作:

let ys = [|2uy; 2uy|]
let xs = Array.init 10 (fun i -> if i < ys.Length then ys.[i] else 0uy)

另一个想法:

let xs = [| for i in 1 .. 10 -> if i <= 2 then 2uy else 0uy |]

另一个想法:

let xs = Array.concat [[|2uy; 2uy|]; Array.zeroCreate 8]

然而,值得注意的是,所有这些都涉及迭代大部分数组以用零替换零。要解决此问题,您可以在第二个示例中尝试以下变体:

let ys = [|2uy; 2uy|]
let xs = Array.zeroCreate<byte> 10
Array.iteri (fun i y -> xs.[i] <- y) ys

对于这种方法,您还可以使用框架的Array.Copy方法:

...
System.Array.Copy(ys, xs, ys.Length)

这会更有效率。想想看,有一个F#Array.blit,还有:

...
Array.blit ys 0 xs 0 ys.Length

答案 1 :(得分:1)

我认为这也可行:

member this.UP = Array.append [|byte(2);byte(2)|] (Array.zeroCreate 8)

答案 2 :(得分:1)

还有一种方式

[|yield 2uy; yield 2uy; for _ in 2..9 -> 0uy|]

但是

[|2uy; 2uy; 0uy; 0uy; 0uy; 0uy; 0uy; 0uy; 0uy; 0uy|]

也很容易。