动态创建锯齿状矩形arrays
在我的项目中,我有很多这样的代码:
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]
?
同样,元素类型仅在运行时才知道。
generics应该做的伎俩:
static T[][] CreateArray(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(10, 20);
那么你可以这样做:
int[,] array = new int[4,2];
你得到的是一个多维数组(4×2)。 这是一篇关于多维数组的好文章。
术语锯齿状数组通常指的是具有不同第二维度的数组。 例如:
int[][] jagged = new int[2][]; jagged[0] = new int[5]; // 5 elements jagged[1] = new int[1]; // 1 element
所以这不是一个2×5数组,而是一个锯齿状的数组..
如果:
- 你肯定想要一个锯齿状的arrays,而不是mOsa提到的多维arrays。
- 你肯定需要它在运行时是动态类型,而不是在编译时使用generics,正如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; }
但是你确定在运行时需要动态类型吗?
正如mOsa所提到的,如果你想要矩形锯齿状arrays,那么最好使用多维数组。
int[,] array = new int[dimension, dimension2];
将生成一个矩形数组。
使用锯齿状数组的原因是,如果要创建具有不同次要维度的数组。 锯齿状数组实际上是一个数组数组,其中多维数组是一个略有不同的野兽。