2010-03-16 14 views
6

En mi proyecto en el que tienen una gran cantidad de código como este:creada dinámicamente matriz rectangular irregular

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

tipos de elementos son diferentes.

¿Hay alguna manera de escribir un método como

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

y conseguir new int[firstDimension][secondDimension]?

Una vez más, el tipo de elementos se conoce solo en tiempo de ejecución.

Respuesta

6

Genéricos debe hacer el truco:

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

usted tiene que especificar el tipo cuando llamar a esto:

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

Gracias, es una gran ayuda para mí, pero eso requeriría una gran refactorización en un proyecto existente. Después de la inicialización, las matrices se utilizan solo como matrices irregulares. – GaGar1n

+0

¿Puedes explicar la refactorización? Edité el 'var', pero eso era solo una notación. –

+0

OK, leí mal el 'en tiempo de ejecución'. Eso significa que @pete tiene una mejor respuesta. –

1

Bien se puede hacer esto:

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

Lo que se obtiene se llama una matriz multidimensional (4x2). Here es un buen artículo sobre arreglos multidimensionales.

El término conjunto irregular generalmente se refiere a las matrices, que tienen diferentes segundas dimensiones. Por ejemplo tomar:

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

así que esto no es una matriz de 2x5, pero una matriz escalonada ..

+0

Eso sería demasiado fácil :) Pero necesito usar las segundas dimensiones como matrices, por ejemplo: int [] a = array [3], que no puedo hacer con una matriz multidimensional. – GaGar1n

0

Como se mencionó Mosa, si quieres matriz escalonada rectangular, entonces es mejor usar una mul matriz ti-dimensional.

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

generará una matriz rectangular.

El motivo para utilizar una matriz dentada es si desea crear una matriz con diferentes dimensiones secundarias. Una matriz dentada es realmente una matriz de matrices, mientras que una matriz multidimensional es una bestia ligeramente diferente.

+0

Una matriz dentada es más rápida. –

+0

Huh, que no sabía. Eso no me sorprende, sin embargo. –

1

Si:

  • definitivamente desea una matriz escalonada, y no uno multidimensional como menciona Mosa.
  • Definitivamente necesita que sea de tipo dinámico en tiempo de ejecución, y no en tiempo de compilación utilizando genéricos como menciona Henk.

Puede utilizar Array.CreateInstance algo como:

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

Pero, ¿estás seguro de necesita esta a por tipo dinámico en tiempo de ejecución?

+0

Gracias, lo intenté también. Por cierto, hay un error - debería ser 'Array arr = Array.CreateInstance (Array, rows)' Creo :) El problema era que no podía referirme a elementos como arr [i] [k] y luego . Casting para escribir [] [] tampoco funcionó. En realidad, tienes razón, puedo olvidarte de los tipos dinámicos y usar genéricos. – GaGar1n

Cuestiones relacionadas