2009-07-08 63 views
12

tôi muốn làm một cái gì đó như:C# gán 1 mảng chiều để cú pháp 2 mảng chiều

object[] rowOfObjects = GetRow();//filled somewhere else 
object[,] tableOfObjects = new object[10,10]; 

tableOfObjects[0] = rowOfObjects; 

là này bằng cách nào đó có thể và cú pháp là gì?

hay tôi cần phải làm điều này:

for (int i = 0; i < rowOfObjects.Length; i++) 
{ 
    tableOfObjects[0,i] = rowOfObjects[i]; 
} 

và lấp đầy các dòng 2 mảng chiều sử dụng một vòng lặp?

Cảm ơn

Trả lời

7

Không, nếu bạn đang sử dụng mảng hai chiều thì không thể. Bạn phải sao chép từng mục.

Nếu bạn sử dụng một mảng lởm chởm, nó hoạt động tốt:

// create array of arrays 
object[][] tableOfObject = new object[10][]; 
// create arrays to put in the array of arrays 
for (int i = 0; i < 10; i++) tableOfObject[i] = new object[10]; 

// get row as array 
object[] rowOfObject = GetRow(); 
// put array in array of arrays 
tableOfObjects[0] = rowOfObjects; 

Nếu bạn đang nhận được tất cả các dữ liệu như hàng, bạn tất nhiên không cần vòng lặp mà đặt mảng trong mảng của mảng , như bạn sẽ chỉ thay thế chúng.

+0

Cảm ơn sự khác biệt giữa: đối tượng [] [] tableOfObject = đối tượng mới [10] [10]; và đối tượng [,] tableOfObjects = đối tượng mới [10,10]; Rất cám ơn. – m3ntat

+3

Một đối tượng [,] là một mảng hai chiều, nó luôn luôn là hình chữ nhật (tất cả các hàng có cùng chiều dài). Một đối tượng [] [] là một mảng răng cưa; một mảng các mảng đối tượng []. Vì mỗi hàng là một mảng trong chính nó, chúng không phải là cùng độ dài. – Guffa

+0

Ahh có ý nghĩa. Cảm ơn Guffa. – m3ntat

-1

Vì vậy, cái gì đó như:

public static object[] GetRow() 
    { 
     object[,] test = new object[10,10]; 
     int a = 0; 
     object[] row = new object[10]; 
     for(a = 0; a <= 10; a++) 
     { 
      row[a] = test[0, a]; 
     } 
     return row; 
    } 
+0

Điều ngược lại; lấy các vật phẩm từ một mảng hai chiều thành một mảng một chiều. (Ngoài ra, một mảng có chiều dài 10 có chỉ số 0-9, không phải 0-10). – Guffa

+0

Rất tiếc, xấu của tôi, tôi đã không thực sự chạy mã, tôi chỉ đang thực hiện nó từ bộ nhớ. –

1

nếu tôi có mảng kích thước gigabyte, tôi sẽ làm điều đó trong C++/CLI chơi với con trỏ và làm chỉ memcpy thay vì phải gazillion mảng hoạt động lập chỉ mục ranh giới kiểm tra chậm.

8

Nếu mảng của bạn là mảng value types, điều đó là có thể.

int[,] twoD = new int[2, 2] { 
    {0,1}, 
    {2,3} 
}; 
int[] oneD = new int[2] 
    { 4, 5 }; 
int destRow = 1; 
Buffer.BlockCopy(
    oneD, // src 
    0, // srcOffset 
    twoD, // dst 
    destRow * twoD.GetLength(1) * sizeof(int), // dstOffset 
    oneD.Length * sizeof(int)); // count 
// twoD now equals 
// {0,1}, 
// {4,5} 

Không thể với một mảng đối tượng.

Lưu ý: Vì .net3.5 điều này sẽ chỉ hoạt động với một mảng nguyên thủy.

Các vấn đề liên quan