2016-01-18 28 views
14

Tôi chỉ muốn tạo một mảng các mảng hai chiều để lưu trữ các điểm tọa độ.Tạo một mảng các mảng hai chiều trong C#

Vì vậy, tôi muốn một mảng trong đó mỗi chỉ mục trả về mảng hai chiều mà tôi sẽ sử dụng làm xy.

Đây là những gì tôi đã cố gắng:

waypoints = new int[4][,] { 
     {{0},{6, 0}}, 
     {{1},{1, 1}}, 
     {{2},{1, 5}}, 
     {{3},{6, 5}} 
    }; 

Tôi nhận ra điều này có lẽ có vẻ ngu ngốc, nhưng tôi đã cố gắng tìm kiếm nó trên Google, và tôi đã không nhận được bất kỳ kết quả tốt.

Nó cung cấp cho một lỗi:

"error CS0623: Array initializers can only be used in a variable or field initializer. Try using a new expression instead "

Tôi cũng đã cố gắng làm việc đó như thế này:

waypoints = new int[4][,] { 
     new int[,] {6, 0}, 
     new int[,] {1, 1}, 
     new int[,] {1, 5}, 
     new int[,] {6, 5} 
     }; 

này đưa ra một lỗi:

"error CS0846: A nested array initializer was expected"

+0

có thể trùng lặp của [Bỏ qua C# mới từ khởi tạo mảng răng cưa] (http://stackoverflow.com/questions/14492279/omitting-c-sharp-new-from-jagged-array-initialization) – ardila

+1

Tại sao không tạo danh sách các cấu trúc 'Vector2' hay đại loại thế? Nó có thể được dễ dàng hơn để làm việc với và đơn giản trong thời gian dài. – rhughes

+1

@rhughes: Chưa kể đến địa điểm tham chiếu tốt hơn (xem xét quan trọng đối với bộ nhớ L-n trong bộ xử lý hiện tại) và thu gom rác giảm (vì * mảng * là một đối tượng và cấu trúc không). –

Trả lời

11

hơn Một khung xoăn thiết {} là yêu cầu trong khai báo ban đầu:

var waypoints = new int[4][,] { 
    new int[,] {{6}, {0}}, 
    new int[,] {{1}, {1}}, 
    new int[,] {{1}, {5}}, 
    new int[,] {{6}, {5}} 
}; 

Điều này là do đối với mảng 2D, mỗi phần tử trong mảng được coi là một mảng cho khởi tạo (mặc dù nó thường được sử dụng cho mỗi phần tử của mảng chẳng hạn như val[0,0] = 4;).

Chỉnh sửa (sau khi thông tin phản hồi từ bình luận):

Đặt trái ngược với int[][] (được gọi là jagged array, đó là: mảng của mảng có thành viên mảng có thể được different size), int[,] là một mảng 2D với fixed dimension . Cả hai đều là mảng lưu trữ các mảng, và do đó mỗi phần tử của mảng là một mảng. Điều này giải thích tại sao cần phải đặt một dấu ngoặc nhọn khác trong quá trình khởi tạo như trên.

mảng 2D như vậy, khi khởi tạo khác nhau, sẽ dẫn đến chiều hướng khác nhau (và do đó có rất nhiều cách để khởi tạo nó):

int[,] val = new int[,] { { 6 }, { 0 } }; //resulting in int[2,1] 
int[,] val = new int[,] { { 6, 0 } }; //resulting in int[1,2] 

Trong cả hai cách, bộ thêm khung xoăn cần.

Đối với sự khác nhau giữa jagged array và đa chiều, cố định kích thước, mảng, therealreadyplentygoodexplanations/benchmarkingavailableonline từ các nguồn có uy tín. Và tôi hiểu rằng nó sẽ không đáng kể, ngoài sự quan tâm của OP, để tôi có thể đưa thêm thông tin về nó. (Và do đó phạm vi cho câu trả lời này ban đầu chỉ được hướng dẫn để trả lời khởi tạo thất bại).

Điều này được hiểu rằng giải pháp không được sử dụng tốt nhất để lưu trữ các điểm tọa độ (như được thực hiện bởi OP). Giải thích ở trên được đưa ra để giải thích lý do tại sao khởi tạo của ông không hoạt động, thay vì cung cấp giải pháp tốt nhất để lưu trữ các điểm tọa độ. Để lưu trữ điểm tọa độ, Point trong System.Drawingstruct sẽ phù hợp hơn (như được đề xuất trong nhận xét).

Việc sử dụng mảng 2D để biểu thị một điểm trong 2D Cartesian coordinate là "quá mức", vì mảng 1D đã có khả năng lưu trữ nhiều số như máy tính cho phép, nhiều hơn hai số cần thiết để lưu trữ điểm trong Descartes hệ tọa độ.

+0

Cảm ơn! Nếu bạn có thể giải thích tại sao điều đó là tôi sẽ hạnh phúc :) – MysticPing

+0

Tôi tin rằng điều này là tốt nhất được giải thích bởi Microsoft trong MSDN: https://social.msdn.microsoft.com/Forums/en-US/283a69b0-169f-4178- 88ce-1b71079897a2/khác biệt-giữa-đơn giản-mảng-và-lởm chởm mảng? Diễn đàn = csharplanguage PS: nhưng nếu bạn muốn lưu trữ điểm, nó có thể là giá trị để lưu trữ nó bằng cách sử dụng 'Point'' class' – Ian

+0

Tôi tin rằng 'mới int [,] {{6.0}} 'sẽ đủ và có thể được cho là dễ đọc hơn – ardila

12

Có một câu trả lời đơn giản cho việc này. Sử dụng các phiên bản của lớp "System.Drawing.Point". Tạo một mảng "Point" để lưu trữ tọa độ. Để tạo mảng:

Point[] points = new Point[4]; 

Và để gán giá trị cho mảng (ví dụ: tại vị trí 0), hãy sử dụng mã sau.

points[0] = new Point(xvalue,yvalue);//Where "xvalue" and "yvalue" are integer variables. 

Và để nhận giá trị X và Y từ một thể hiện của lớp điểm. Sử dụng mã dưới đây.

int xvalue = points[0].X; 

int yvalue = points[0].Y; 

P.S. Bạn có thể sử dụng những điểm này để gán địa điểm để Controls, nhưng đó là một câu chuyện khác^_^

+1

Cảm ơn, bệnh nhìn nó lên! – MysticPing

2

Các mảng hai chiều và có kích thước không rõ, initializer có thể định nghĩa mảng của các kích cỡ khác nhau:

 var waypoints = new int[4][,] { 
       new int[,] { {1, 2, 6}, {3, 4, 5} }, // two rows, 3 columns 
       new int[,] { {1, 1}, {1, 2} } , // 2 x 2 
       new int[,] { {1, 5} }, // 1 x 2 
       new int[,] { {6, 5} } 
       }; 
Các vấn đề liên quan