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

时间:2012-06-16 13:44:46

标签: .net arrays f#

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

byte[] b = new byte[x];

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

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

let b = Array.create x ( new Byte() )

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

4 个答案:

答案 0 :(得分:10)

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

let b: byte [] = Array.zeroCreate x

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

对于F#中dynamic size的{​​{1}},它在分配时由b值定义一次,以后通过更改x无法更改,类似于C#/ Java ,

答案 1 :(得分:8)

let b = Array.create<byte> x 0uy  //Array.zeroCreate<byte> x

答案 2 :(得分:6)

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

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

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

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

let arr = Array.init 10 (fun i -> byte(i*i))

let arr = [| for i in 0..9 do -> byte(i*i)|]

看看this MSDN page;它包含有关在F#中使用Array的有用信息。

答案 3 :(得分:-1)

你是什么意思?

F#的语法与 C# Java 不同,您正在使用Array模块让他创建一个数组使用初始化程序。没有什么奇怪的,一种语言是功能性的,而另一种语言是必要的,因此确实需要这些差异。

根据 F#语言规范,您无法声明未初始化的内容(除非使用特定模式作为Option类型,这些模式只是可以表达未初始化概念的漏洞利用没有真正拥有它,这就是为什么你必须为数组中的元素传递初始化器。