2011-01-10 26 views
40
  1. Cuál es la diferencia entre la matriz dentada y la matriz multidimensional. ¿Hay un beneficio de uno en el otro?¿Por qué tenemos una matriz dentada y una matriz multidimensional?

  2. Y ¿por qué el Visual Studio no me permite hacer un

    MyClass[][] abc = new MyClass[10][20]; 
    

    (que solía hacer que en C++, pero en C# subraya [20] con la línea wriggly roja .. Dice rango no válido especificador)

    pero está contento con

    MyClass[,] abc = new MyClass[10,20]; 
    
  3. por último, ¿cómo puedo inicializar esto en una sola línea (como lo hacemos en sencilla matriz con {new xxx...}{new xxx....})

    MyClass[][,][,] itemscollection; 
    
+6

El objetivo de una matriz dentada es que las matrices "anidadas" no necesitan tener un tamaño uniforme. – Ani

+1

http://msdn.microsoft.com/en-us/library/2yd9wwz4(v=vs.71).aspx - La sintaxis de matriz multidimensional como [X, Y] es válida de acuerdo con los documentos – ndtreviv

+0

Subpregunta adicional: ¿Es posible utilizar foreach() con matriz multidimensional? –

Respuesta

51
  1. Una matriz escalonada es una matriz-de-arrays, por lo que un int[][] es una matriz de int[], cada uno de los cuales pueden ser de diferentes longitudes y ocupar su propio bloque en la memoria. Una matriz multidimensional (int[,]) es un bloque único de memoria (esencialmente una matriz).

  2. no se puede crear un MyClass[10][20] porque cada sub-matriz tiene que ser inicializado por separado, ya que son objetos separados:

    MyClass[][] abc = new MyClass[10][]; 
    
    for (int i=0; i<abc.Length; i++) { 
        abc[i] = new MyClass[20]; 
    } 
    

    un MyClass[10,20] es aceptable, ya que se está inicializando un solo objeto como una matriz con 10 filas y 20 columnas

  3. A MyClass[][,][,] pueden initailized como tal (no compilar probado aunque):

    MyClass[][,][,] abc = new MyClass[10][,][,]; 
    
    for (int i=0; i<abc.Length; i++) { 
        abc[i] = new MyClass[20,30][,]; 
    
        for (int j=0; j<abc[i].GetLength(0); j++) { 
         for (int k=0; k<abc[i].GetLength(1); k++) { 
          abc[i][j,k] = new MyClass[40,50]; 
         } 
        } 
    } 
    

Tenga en cuenta que CLR está muy optimizado para el acceso a una matriz de una dimensión, por lo que el uso de una matriz irregular probablemente sea más rápido que una matriz multidimensional del mismo tamaño.

+3

¿Puede indicarnos alguna evidencia de que los accesos de matriz unidimensional son más rápidos? – GreyCloud

+5

@GreyCloud - http://stackoverflow.com/questions/597720/what-is-differences-between-multidimensional-array-and-array-of-arrays-in-c – thecoop

+0

¿Hay un caso de uso (común) para el matriz multidimensional? – ryanwebjackson

22

Una matriz escalonada es una matriz de matrices. No se garantiza que cada matriz sea del mismo tamaño. Usted podría tener

int[][] jaggedArray = new int[5][]; 
jaggedArray[0] = { 1, 2, 3 }; // 3 item array 
jaggedArray[1] = new int[10]; // 10 item array 
// etc. 

Es un conjunto de matrices relacionadas.

Una matriz multidimensional, por otro lado, es más una agrupación cohesiva, como una caja, tabla, cubo, etc., donde no hay longitudes irregulares. Es decir

int i = array[1,10]; 
int j = array[2,10]; // 10 will be available at 2 if available at 1 
+0

Directo al grano. Gran respuesta. +1 – wassimans

+0

Probé tu código. No compiló. Intente agregar int [3] así que pruebe 'jaggedArray [0] = int [3] {1, 2, 3}'; – barlop

+0

Sé que esto es viejo, pero solo con fines informativos, no es necesario int [3]. un simple int [] es todo lo que importa. int [] [] myArray = new int [5] []; myArray [0] = new int [] {1, 2, 3, 4}; Esto es todo lo que es necesario. – Velocibadgery

6

Una matriz rectangular siempre tiene la misma cantidad de columnas para cada fila.

MyClass[,] x = new MyClass[10,30] 

Cada fila tiene 30 columnas, mientras que en una matriz dentada, esto no es necesario. Por lo tanto, yo creo que tengas para inicializar todos los 'fila' en una matriz escalonada por separado:

MyClass[][] x = new MyClass[10][]; 

for(int i = 0; i < 10; i++) 
{ 
    x[i] = new MyClass[30]; 
} 

De hecho, esto significa que no todas las filas de la matriz escalonada debe contener el mismo número de elementos. (En mi ejemplo, tiene la misma cantidad de elementos, pero esto no es obligatorio).

Se puede hacer perfectamente esto, por ejemplo:

MyClass[][] x = new MyClass[10][]; 

for(int i = 0; i < 10; i++) 
{ 
    x[i] = new MyClass[(30 + i)]; 
} 

This podría ser un interesante artículo para usted.

1

Si está buscando una matriz multidimensional que tenga límites establecidos, utilice siempre la sintaxis de estilo [,]. Esto asegurará que cada porción tenga el mismo tamaño.

Cuando usa [][], lo que realmente está pasando es que está creando una matriz de matrices. Esto significa que cada matriz se puede dimensionar de manera diferente. Por ejemplo:

int[][] jaggedArray = new int[5][] 
for(int index = 0; index < jaggedArray.Length ; ++index) 
{ 
    jaggedArray[index] = new int[index + 1]; 
} 
1

La declaración en línea podría ser algo como esto:

int[,] numbers = { {1, 2}, {3, 4}, {5, 6} }; 
1

para # 1, ver this SO question

para matrices en línea dentados o multidimensionales, consulte este programming guide:

// Three-dimensional array. 
int[, ,] array3D = new int[,,] { { { 1, 2, 3 }, { 4, 5, 6 } }, { { 7, 8, 9 }, { 10, 11, 12 } } }; 
// Same array with dimensions specified. 
int[, ,] array3Da = new int[2, 2, 3] { { { 1, 2, 3 }, { 4, 5, 6 } }, { { 7, 8, 9 }, { 10, 11, 12 } } }; 

No es necesario que especifique el dimen sions (array3D), pero si sabe que nunca van a cambiar, es útil saber qué dimensiones está usando (array3Da).

0

Debería entender el funcionamiento interno de la matriz la matriz multidimensional actúa como una matriz de una sola dimensión, excepto que la doble indexación se convierte en una sola.

Su matriz de Jagged en C# es una matriz de objetos que a su vez son matrices.

3

ad 3) Para inicializar un monstruo tal como [][,][,], se puede hacer algo como:

 int [,][,] multiArr1 = { { new int[,] { { 2, 2 }, { 1, 1 } }, 
            new int[,] { { 2, 2 }, { 1, 1 } } }, 
            { new int[,] { { 2, 2 }, { 1, 1 } }, 
             new int[,] { { 2, 2 }, { 1, 1 } } } }; 
     int [,][,] multiArr2 = { { new int[,] { { 2, 2 }, { 1, 1 } }, 
            new int[,] { { 2, 2 }, { 1, 1 } } }, 
            { new int[,] { { 2, 2 }, { 1, 1 } }, 
             new int[,] { { 2, 2 }, { 1, 1 } } } }; 

     int [][,][,] superMultiArray = { multiArr1, multiArr2 }; 
0

Creo que 2d matrices dentadas de asignación de memoria en C# es como matrices 2D en C++ y C Debido a 2d las matrices irregulares tienen un puntero que apunta a un conjunto de punteros que cada uno de estos punteros apunta a una matriz de elementos (por ejemplo, elementos enteros); como este código en C++,

int** 2DArr {new int* [number1]}; 
for (int i = 0; i < number1; i++) 
{ 
    2DArr[i] = new int[number2]; 
} 

la asignación de memoria de abajo código es el mismo como matrices dentados 2D en C#. Pero tengo dudas, ¿podría explicar más si pienso de la manera incorrecta?

Cuestiones relacionadas