如何使用.net数组?

时间:2012-09-06 16:48:45

标签: .net arrays f#

我读到有关处理数组时我们应该使用myArray.[i],但是,根据我的经验myArray[i]编译。

但是,当我想写入.Net中的数组(因此它是可变的)时,会出现错误let myArray.[i] = 3,但let myArray[i] =3有效。

处理此类事情的最佳做法是什么?

另外,我应该使用Array.get还是使用.[]

如何将值设置为锯齿状数组,例如let myArray.[i].[j] = 5

3 个答案:

答案 0 :(得分:5)

1)如果要为数组单元格指定值,请使用赋值运算符<-

myArray.[i] <- 3 

2)let myArray[i] = 3编译,因为编译器将其理解为myArray函数,并以列表作为参数并返回3。如果您阅读了警告和类型签名,您会发现自己做错了。

3)Array.geta single call to .[]。在某些情况下,Array.get对于函数组合和避免类型注释很方便。例如,你有

let mapFirst arrs = Array.map (fun arr -> Array.get arr 0) arrs 

VS

let mapFirst arrs = Array.map (fun (arr: _ []) -> arr.[0]) arrs

答案 1 :(得分:4)

您的方法都不正确。假设你有一些像

这样的定义
let myArray = [| 1; 7; 15 |]
let i = 2

你真正想要的是这样的:

myArray.[i] <- 3

写作时

let myArray[i] = 3

你实际上是在定义一个函数 myArray,它接受一个整数列表并返回一个整数。这根本不是你想要的。

答案 2 :(得分:2)

这里的问题是你试图在let表达式中嵌入一个数组赋值。表达式let myArray[3] = 2 是对数组的赋值。相反,它是一个功能定义。看看fsi中发生了什么:

let myArray[i] = 3;;
val myArray : int list -> int

(那里实际上也有警告)。以不同方式对其进行格式化也会发现这一事实:let myArray [3] = 2

正如其他人指出的那样,.[]用于数组访问,并且要分配给数组,您使用myArray.[i] <- 3(在let表达式中 not )。< / p>