我有以下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);|]
有没有办法用空字节初始化数组的其余部分?
答案 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|]
也很容易。