matriz - multidimensional array c# examples
¿Por qué tenemos una matriz dentada y una matriz multidimensional? (9)
¿Cuál es la diferencia entre la matriz dentada y la matriz multidimensional? ¿Hay un beneficio de uno en el otro?
¿Y por qué el Visual Studio no me permite hacer una
MyClass[][] abc = new MyClass[10][20];
(Solíamos hacer eso en C ++, pero en C # subraya [20] con línea roja ondulada ... dice especificador de rango inválido)
pero está feliz con
MyClass[,] abc = new MyClass[10,20];
Finalmente, ¿cómo puedo inicializar esto en una sola línea (como hacemos en una matriz simple con
{new xxx...}{new xxx....}
MyClass[][,][,] itemscollection;
Una matriz dentada es una matriz de arreglos, por lo que una
int[][]
es una matriz deint[]
, cada una de las cuales puede tener diferentes longitudes y ocupar su propio bloque en la memoria. Una matriz multidimensional (int[,]
) es un bloque único de memoria (esencialmente una matriz).No puede crear un
MyClass[10][20]
porque cada subarranque debe inicializarse 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]; }
una
MyClass[10,20]
está bien porque está inicializando un solo objeto como una matriz con 10 filas y 20 columnasUna
MyClass[][,][,]
puede ser inutilizada como tal (aunque no compilada):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 será más rápido que una matriz multidimensional del mismo tamaño.
Anuncio 3) Para inicializar un monstruo como [][,][,]
, puedes 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 };
Creo que la asignación de memoria de 2d matrices dentadas en C # es como arreglos 2d en C ++ y C. Debido a que las 2d matrices irregulares tienen un puntero que apunta a un conjunto de punteros que apuntan 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 del código siguiente es la misma que la de las matrices 2d dentadas en C #. Pero tengo dudas, ¿podría explicar más si pienso de la manera incorrecta?
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 son, a su vez, matrices.
La declaración en línea sería algo como esto:
int[,] numbers = { {1, 2}, {3, 4}, {5, 6} };
Para # 1, vea esta pregunta SO
Para arreglos en línea irregulares o multidimensionales, consulte esta guía de programación :
// 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 tiene que especificar las dimensiones (array3D), pero si sabe que nunca van a cambiar, es útil saber qué dimensiones está usando (array3Da).
Si está buscando una matriz multidimensional que haya establecido límites, use siempre la sintaxis de estilo [,]
. Esto asegurará que cada porción tenga el mismo tamaño.
Cuando usa [][]
lo que realmente está sucediendo 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];
}
Una matriz dentada es una matriz de matrices. No se garantiza que cada matriz sea del mismo tamaño. Podrías 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
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 obligatorio. Por lo tanto, creo que tendrás que inicializar cada ''fila'' en una matriz dentada 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 dentada deben contener la misma cantidad de elementos. (En mi ejemplo, tiene la misma cantidad de elementos, pero esto no es obligatorio).
Puede hacer esto perfectamente, 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 artículo interesante para ti.