2010-03-16 36 views
6

Trong dự án của tôi, tôi có rất nhiều mã như thế này:động tạo ra lởm chởm mảng hình chữ nhật

int[][] a = new int[firstDimension][]; 
for (int i=0; i<firstDimension; i++) 
{ 
    a[i] = new int[secondDimension]; 
} 

loại của các yếu tố khác nhau.

Có cách nào viết một phương pháp như

createArray(typeof(int), firstDimension, secondDimension); 

và nhận new int[firstDimension][secondDimension]?

Một lần nữa, loại phần tử chỉ được biết khi chạy.

Trả lời

6

Generics nên làm các trick:

static T[][] CreateArray<T>(int rows, int cols) 
{ 
    T[][] array = new T[rows][]; 
    for (int i = 0; i < array.GetLength(0); i++) 
     array[i] = new T[cols]; 

    return array; 
} 

Bạn phải xác định loại khi gọi điện thoại này:

char[][] data = CreateArray<char>(10, 20); 
+0

Cảm ơn, đó là một trợ giúp lớn đối với tôi, nhưng điều đó sẽ đòi hỏi một sự tái cấu trúc lớn trong một dự án hiện có. Sau khi khởi tạo, các mảng chỉ được sử dụng làm mảng răng cưa. – GaGar1n

+0

Bạn có thể giải thích việc tái cấu trúc không? Tôi đã chỉnh sửa 'var', nhưng đó chỉ là ký hiệu. –

+0

OK, tôi đã đọc sai 'lúc chạy'. Điều đó có nghĩa là @pete có một câu trả lời tốt hơn. –

1

Vâng, bạn có thể làm điều này:

int[,] array = new int[4,2]; 

Những gì bạn nhận được gọi là một mảng đa chiều (4x2). Here là một bài viết hay về mảng đa chiều.

Mảng có răng cưa thuật ngữ thường đề cập đến mảng, có thứ nguyên thứ hai khác nhau. Ví dụ thực hiện:

int[][] jagged = new int[2][]; 
jagged[0] = new int[5]; // 5 elements 
jagged[1] = new int[1]; // 1 element 

vì vậy đây không phải là một mảng 2x5, nhưng một mảng lởm chởm ..

+0

Điều đó sẽ quá dễ dàng :) Nhưng tôi cần sử dụng thứ nguyên thứ hai làm mảng, ví dụ: int [] a = array [3], mà tôi không thể làm với mảng đa chiều. – GaGar1n

0

Như mOsa đã đề cập, nếu bạn muốn mảng có răng cưa hình chữ nhật, thì bạn nên sử dụng mul mảng ti chiều.

int[,] array = new int[dimension, dimension2]; 

sẽ tạo một mảng hình chữ nhật.

Lý do sử dụng mảng bị lởm chởm, là nếu bạn muốn tạo mảng có thứ nguyên phụ khác nhau. Một mảng lởm chởm thực sự là một mảng các mảng, nơi mà một mảng đa chiều là một con thú hơi khác.

+0

Mảng lởm chởm nhanh hơn. –

+0

Huh, mà tôi không biết. Điều đó không làm tôi ngạc nhiên. –

1

Nếu:

  • Bạn chắc chắn muốn có một mảng lởm chởm, và không phải là một đa chiều như Mosa đề cập đến.
  • Bạn chắc chắn cần nó là loại động trong thời gian chạy, và không phải lúc biên dịch bằng cách sử dụng Generics như Henk đề cập đến.

Bạn có thể sử dụng Array.CreateInstance cái gì đó như:

static Array CreateArray (Type t, int rows, int cols) 
{ 

    Array arr = Array.CreateInstance (typeof(Array), rows); 
    for (int i = 0; i < rows; rows++) { 
     arr.SetValue (Array.CreateInstance(t, cols), i); 
    } 

    return arr; 
} 

Nhưng bạn có chắc chắn bạn cần điều này để theo loại động khi chạy?

+0

Cảm ơn, đã thử điều này. Nhân tiện, có một lỗi - nên là 'Array arr = Array.CreateInstance (Array, rows)' Tôi nghĩ :) Vấn đề là tôi không thể tham chiếu đến các phần tử như arr [i] [k] . Việc nhập để nhập [] [] cũng không hoạt động. Thực ra, bạn nói đúng, tôi có thể quên các loại động và sử dụng Generics. – GaGar1n

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