2010-03-16 48 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