如是我闻,MSDN 里面记载:
F#数组的创建方法大概分三类:
1、把初始值包含在[| 和 |]之内,
let array1 = [| 1; 2; 3 |]
或者
let array1 = [|
1
2
3
|]
F#数组的创建方法大概分三类:
1、把初始值包含在[| 和 |]之内,
let array1 = [| 1; 2; 3 |]
或者
let array1 = [|
1
2
3
|]
2、使用Array.zeroCreate或者Array.Create,和Array.init
如果要创建一个所有元素都初始化为零的数组,可以使用 Array.zeroCreate,
let arrayOfTenZeroes : byte array = Array.zeroCreate 10
这里就是创建长度为10,初始值为0的字节数组,如果不指定为byte array,则默认为int array
也可以使用Array.Create
let arrayOfTenZeroes = Array.Create 10 0uy
Array.Create函数强大而便捷,第一个参数指定了数组的长度,而第二个参数就指定了数组的类型和初始值。
在这里0uy表示初始值为0,其中uy为字节类型的后缀,F#编译器就可以辨认出它为字节数组。
Array.init相对灵活一点,也复杂一点,下面函数是初始值为0到4平方的数组:
let array = Array.init 5 (fun i->i * i)
let array = Array.init 5 (fun i->i * i)
如上面的arrayOfTenZeroes,则可以写成:
let arrayOfTenZeroes = Array.init 10 (fun _->0)
let arrayOfTenZeroes = Array.init 10 (fun _->0)
3、一种销魂的写法,使用序列表达式:
let array3 = [| for i in 1 .. 10 -> i * i |]
这里数组被初始化为1到10的平方。这种写法适合复杂的初始化,再看看这例子:
let aseq =
seq{
yield! System.Text.Encoding.Default.GetBytes("XXXCID")
yield 1uy
for i = 0 to 512 do
yield 0uy
}
let data = [| for i in aseq -> i |]
这里aseq序列在data赋值时候才执行计算,性能得到保障,而数组直接初始化,没有出现重复赋值的情况。F#的函数库里包含了对数组的很多操作,包括Linq,还有排序等。详情可以查阅MSDN。值得一提的是,F#内置有切片的功能,很实用:
// 返回数组的0到2。
array1.[0..2]
// 返回数组,从开始到2。
array1.[..2]
// 返回数组,从2到最后。
array1.[2..]
array1.[0..2]
// 返回数组,从开始到2。
array1.[..2]
// 返回数组,从2到最后。
array1.[2..]