2010-03-16 84 views
6

在項目中,我有很多這樣的代碼:動態創建的鋸齒狀矩形陣列

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

元素的類型是不同的。

有沒有寫像

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

的方法和得到new int[firstDimension][secondDimension]的方法嗎?

再次,元件的類型僅在運行時是已知的。

回答

6

泛型應該做的伎倆:

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; 
} 

你必須以指定的類型調用此:

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

謝謝,這對我來說是一個很大的幫助,但這需要對現有項目進行大量的重構。 初始化後,數組僅用作鋸齒狀數組。 – GaGar1n 2010-03-16 22:19:13

+0

你能解釋重構嗎?我編輯了'var',但那只是表示法。 – 2010-03-16 22:22:41

+0

好吧,我誤解了'在運行時'。這將意味着@pete有更好的答案。 – 2010-03-16 22:24:22

1

那麼你可以這樣做:

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

你得到的是被稱爲多維數組(4×2)。 Here是一篇關於多維數組的好文章。

術語鋸齒狀陣列通常是指陣列中,具有不同的第二尺寸。例如採取:

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

所以這不是一個2×5陣列,但交錯數組..

+0

這將是太容易:) 但我需要使用第二尺寸作爲陣列,例如:INT [] A =陣列[3],這是我不能與多維數組做。 – GaGar1n 2010-03-16 22:16:44

0

如莫薩提到的,如果你想矩形交錯數組,那麼你最好使用MUL ti維數組。

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

會產生一個矩形陣列。

使用交錯數組的原因是,如果你想創建一個不同的輔助維度的數組。鋸齒狀數組實際上是一個數組數組,其中作爲多維數組是一個稍微不同的野獸。

+0

鋸齒陣列速度更快。 – 2010-03-16 22:18:45

+0

呵呵,我不知道。但這並不令我感到意外。 – 2010-03-16 23:30:21

1

如果:

  • 你一定要交錯數組,而不是作爲摩薩提到多維之一。
  • 你絕對需要它在運行時是動態類型的,而不是在編譯時使用泛型作爲Henk提到的。

您可以使用Array.CreateInstance類似:

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; 
} 

但你肯定在運行時需要用它來通過動態類型?

+0

謝謝,也試過這個。順便說一下,有一個錯誤 - 應該是'Array arr = Array.CreateInstance(Array,rows)'我認爲:) 問題是我不能引用像arr [i] [k]這樣的元素,然後。投射到[] []類型也不起作用。 其實,你是對的,我可以忘記動態類型和使用泛型。 – GaGar1n 2010-03-16 22:36:20