2010-03-16 23 views
6

Nel mio progetto ho un sacco di codice come questo:dinamicamente creato matrice rettangolare frastagliata

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

tipi di elementi sono diversi.

C'è un modo di scrivere un metodo come

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

e ottenere new int[firstDimension][secondDimension]?

Ancora una volta, il tipo di elementi è noto solo in fase di esecuzione.

risposta

6

Generics dovrebbe fare il trucco:

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

che c'è bisogno di specificare il tipo quando chiamando questo:

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

Grazie, è un grande aiuto per me, ma ciò richiederebbe un enorme refactoring in un progetto esistente. Dopo l'inizializzazione, gli array vengono utilizzati solo come matrici frastagliate. – GaGar1n

+0

Puoi spiegare il refactoring? Ho modificato la 'var', ma quella era solo una notazione. –

+0

OK, ho letto male "al momento dell'esecuzione". Ciò significherebbe che @pete ha una risposta migliore. –

1

Ebbene si può fare questo:

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

Quello che si ottiene è chiamato un array multidimensionale (4x2). Here è un bell'articolo sugli array multidimensionali.

Il termine array frastagliato si riferisce di solito a matrici che hanno diverse seconde dimensioni. Per esempio prendere:

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

quindi questo non è un array 2x5, ma una matrice irregolare ..

+0

Sarebbe troppo semplice :) Ma ho bisogno di usare le seconde dimensioni come array, ad esempio: int [] a = array [3], che non posso fare con array multidimensionale. – GaGar1n

0

Come mOsa ha menzionato, se si desidera matrice rettangolare frastagliata, allora è meglio usare un matrice ti-dimensionale.

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

genererà una matrice rettangolare.

Il motivo per utilizzare una matrice seghettata è se si desidera creare una matrice con dimensioni secondarie diverse. Un array frastagliato è in realtà una matrice di array, in cui un array multidimensionale è un animale leggermente diverso.

+0

Una matrice seghettata è più veloce. –

+0

Huh, che non sapevo. Questo non mi sorprende però. –

1

Se:

  • Volete sicuramente una matrice irregolare, e non un multi-dimensionale come cita MOSA.
  • È necessario che sia di tipo dinamico in fase di esecuzione e non in fase di compilazione utilizzando generici come menzionato da Henk.

È possibile utilizzare Array.CreateInstance qualcosa di simile:

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

Ma siete sicuri avete bisogno di questo per per tipo dinamico in fase di esecuzione?

+0

Grazie, ho provato anche questo. A proposito, c'è un errore - dovrebbe essere 'Array arr = Array.CreateInstance (Array, rows)' Penso :) Il problema era che non potevo riferirmi a elementi come arr [i] [k] allora . Il casting per digitare [] [] non ha funzionato. In realtà, hai ragione, posso dimenticare i tipi dinamici e utilizzare i generici. – GaGar1n

Problemi correlati