Ahora que sabemos cómo recuperar la longitud de un conjunto de una sola dimensión, echemos un vistazo a cómo hacemos lo mismo a través de múltiples dimensiones. En este ejemplo, vamos a escribir una aplicación que asigna una cuadrícula de 20×30 números, y luego recuperar y mostrar la longitud.
12345678910111213 usando el Sistema;namespace.ObtainingArrayLength.MultiDimensions{classProgram{estaticvoidMain(string[] args){int[,] myIntegers =newint[20,30];int length = myIntegers.Length; Console.WriteLine($"En dos dimensiones, la longitud total es {longitud}");}}}
csharp
Cuando construimos y ejecutamos este ejemplo, terminamos con lo siguiente escrito en la consola: En dos dimensiones, la longitud total es 600 Lo que estamos viendo aquí es que la longitud, en este caso se refiere a la longitud a través de todas las dimensiones en la matriz; por lo tanto, la longitud aquí es 20×30. Lo que es más interesante es lo que sucede con el IL. El IL para obtener la longitud en una dimensión es trivial, pero se ve muy diferente para múltiples dimensiones.
123ldloc.0 // myIntegerscallvirt instance int32 [System.Runtime]System.Array::get_Length()stloc.1 // length
La línea de callvirt está llamando a Array.get_Length y luego pone el valor resultante en la pila de evaluación listo para su uso. Esto nos dice que hay una diferencia obvia en el comportamiento entre los arreglos de una sola dimensión y los de múltiples dimensiones.
Podríamos estar tentados de obtener la longitud de una dimensión en particular intentando algo como esto:
1int length = myIntegers[0].Length;
csharp
Si lo escribiéramos e intentáramos compilar nuestro código, nos encontraríamos con que falla al compilar con la siguiente advertencia: Número incorrecto de índices dentro de []; se espera que sean 2
Como sabemos que nuestra matriz tiene dos dimensiones, podría parecer razonable que pudiéramos tratar de obtener la matriz de la segunda dimensión de esta manera:
1int length = myIntegers[0,0].Length;
csharp
Si intentáramos compilar este código, obtendríamos el siguiente error de compilación porque myIntegers[0,0] es el valor en sí mismo: $0027int$0027 no contiene una definición de $0027Longitud$0027 y no se ha podido encontrar ningún método de extensión $0027Longitud$0027 que acepte un primer argumento de tipo $0027int$0027 (¿te falta una directiva de uso o una referencia en ensamblador?)
Ahora que sabemos que no podemos obtener la longitud de una dimensión individual en un conjunto multidimensional usando la longitud, ¿cómo obtenemos realmente la longitud?
Afortunadamente para nosotros, .NET proporciona un método útil llamado GetLength que acepta la dimensión que queremos recuperar.
Usando GetLength nuestro código se ve así:
1234567891011121314 usando el Sistema;namespace.ObtainingArrayLength.MultiDimensions{classProgram{estaticvoidMain(string[] args){int[,] myIntegers =newint[20,30];int firstDimension = myIntegers. GetLength(0);int secondDimension = myIntegers.GetLength(1); Console.WriteLine($"La longitud total es {firstDimension}x{secondDimension}");}}}
csharp
Ahora, si compilamos y ejecutamos el programa, obtendremos las longitudes de cada dimensión correctamente impresas: La longitud total es de 20×30