2010-05-25 39 views
14

Sự khác nhau giữa 'a[,,]'a[][][] là gì? Cả hai đều đại diện cho mảng 3-d. Nó làm cho tôi viết array3d.[x].[y].[z] thay vì array3d.[x, y, z].F # Các loại mảng đa chiều

Tại sao tôi không thể làm như sau?

> let array2d : int[,] = Array2D.zeroCreate 10 10;; 
> let array1d = array2d.[0];; 

error FS0001: This expression was expected to have type 
    'a []  
but here has type 
    int [,] 

Trả lời

32

Sự khác biệt là 'a[][] đại diện cho một mảng của mảng (có độ dài có thể khác nhau), trong khi ở 'a[,], đại diện cho một mảng 2D hình chữ nhật. Loại đầu tiên còn được gọi là mảng răng cưa và loại thứ hai được gọi là mảng đa chiều. Sự khác biệt cũng giống như trong C#, vì vậy bạn có thể muốn xem tài liệu C# cho jagged arraysmultidimensional arrays. Ngoài ra còn có một tài liệu excelent trong F# WikiBook.

Để chứng minh điều này bằng cách sử dụng hình ảnh, một giá trị kiểu 'a[][] có thể trông như thế này:

0 1 2 3 4 
5 6 
7 8 9 0 1 

Trong khi một giá trị kiểu a[,] sẽ luôn là một hình chữ nhật và có thể tìm kiếm ví dụ như thế này:

0 1 2 3 
4 5 6 7 
8 9 0 1 

Để có được một "dòng" duy nhất của một mảng đa chiều, bạn có thể sử dụng các ký hiệu lát:

let array1d = array2d.[0..0,0..9];; 

Slices thực sự trở lại mảng đa chiều (trong trường hợp này, với một chiều bằng 1), do đó bạn có thể viết một hàm chuyển đổi mà trả 'a[] như thế này:

let toArray (arr:_[,]) = 
    Array.init arr.Length (fun i -> arr.[0, i]) 

let array1d = array2d.[0..0,0..9] |> toArray;;