在F#中创建一个动态大小的字节数组

Joh*_*all 10 .net arrays f#

在C#和Java中,可以像这样创建一个字节数组

byte[] b = new byte[x];
Run Code Online (Sandbox Code Playgroud)

where x表示数组的大小.我想做的是在F#中做同样的事情.我已经搜索了如何操作并在文档中查找它.我认为我可能使用了错误的搜索词,因为我无法找到方法.

到目前为止我发现的是Array.create可以像这样使用:

let b = Array.create x ( new Byte() )
Run Code Online (Sandbox Code Playgroud)

还有另一种方法可以做到这一点,它更类似于在C#和Java中完成的方式吗?

Gen*_*ski 12

最接近的F#模拟是Array.zeroCreate:

let b: byte [] = Array.zeroCreate x
Run Code Online (Sandbox Code Playgroud)

0在Java和C#平台上,F#不是将隐式数组元素初始化为字节,而是使数组元素的初始值明显.

至于dynamic sizeb在F#它被定义一次x值在分配并且不能被改变以后改变x,类似于C#/爪哇,.


BLU*_*IXY 9

let b = Array.create<byte> x 0uy  //Array.zeroCreate<byte> x
Run Code Online (Sandbox Code Playgroud)


pad*_*pad 6

我想你想要创建一个未初始化的数组并在以后填充它:

let arr = Array.zeroCreate 10
for i in 0..9 do
   arr.[i] <- byte(i*i)
Run Code Online (Sandbox Code Playgroud)

这是你通常用C#/ Java做的方式,这在F#中是单一的.想一想; 如果你忘记初始化一些元素,你必须处理null恶梦.

几乎在所有情况下,您始终可以通过Array模块或数组理解中的高阶函数替换上述过程:

let arr = Array.init 10 (fun i -> byte(i*i))
Run Code Online (Sandbox Code Playgroud)

要么

let arr = [| for i in 0..9 do -> byte(i*i)|]
Run Code Online (Sandbox Code Playgroud)

看看这个MSDN页面 ; 它包含有关在F#中使用Array的有用信息.

  • 什么是"空"噩梦?Java和C#都隐式地将字节数组的元素初始化为值为0的字节. (3认同)
  • 我的意思是一般使用带有对象的`Array.zeroCreate`.这个具体案例没有问题. (2认同)