76 votos

Iteración de matrices multidimensionales con sentencia Foreach anidada

Creo que esta puede ser una pregunta bastante sencilla, pero aún no he podido resolverla. Si tengo un Array de 2 dimensiones así:

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

¿Cuál es la mejor manera de iterar por cada dimensión del Array con un foreach ¿declaración?

124voto

ICR Puntos 6960

Si quieres iterar sobre cada elemento del Array como si fuera un Array aplanado, puedes hacerlo:

foreach (int i in array) {
    Console.Write(i);
}

que imprimiría

123456

Si quieres conocer también los índices x e y, tendrás que hacer:

for (int x = 0; x < array.GetLength(0); x += 1) {
    for (int y = 0; y < array.GetLength(1); y += 1) {
        Console.Write(array[x, y]);
    }
}

También se puede utilizar un Array dentado en su lugar (un Array de arrays):

int[][] array = new int[2][] { new int[3] {1, 2, 3}, new int[3] {4, 5, 6} };
foreach (int[] subArray in array) {
    foreach (int i in subArray) {
        Console.Write(i);
    }
}

o

int[][] array = new int[2][] { new int[3] {1, 2, 3}, new int[3] {4, 5, 6} };
for (int j = 0; j < array.Length; j += 1) {
    for (int k = 0; k < array[j].Length; k += 1) {
        Console.Write(array[j][k]);
    }
}

21voto

Daniel Plaisted Puntos 11183

A continuación se explica cómo visitar cada elemento de un Array bidimensional. ¿Es esto lo que estabas buscando?

for (int i=0;i<array.GetLength(0);i++)
{
    for (int j=0;j<array.GetLength(1);j++)
    {
        int cell = array[i,j];
    }
}

6voto

polygenelubricants Puntos 136838

En el caso de las matrices multidimensionales, se puede utilizar el mismo método para iterar por los elementos, por ejemplo:

int[,] numbers2D = new int[3, 2] { { 9, 99 }, { 3, 33 }, { 5, 55 } };
foreach (int i in numbers2D)
{
    System.Console.Write("{0} ", i);
}

La salida de este ejemplo es:

9 99 3 33 5 55

Referencias


En Java, las matrices multidimensionales son matrices de matrices, por lo que lo siguiente funciona:

    int[][] table = {
            { 1, 2, 3 },
            { 4, 5, 6 },
    };
    for (int[] row : table) {
        for (int el : row) {
            System.out.println(el);
        }
    }

4voto

Keven M Puntos 413

Sé que este es un viejo post, pero lo encontré a través de Google, y después de jugar con él creo que tengo una solución más fácil. Si me equivoco, por favor, señalarlo, 'cuz me gustaría saber, pero esto funcionó para mis propósitos, al menos (Se basa en la respuesta de ICR):

for (int x = 0; x < array.GetLength(0); x++)
{
    Console.Write(array[x, 0], array[x,1], array[x,2]);
}

Dado que las dos dimensiones son limitadas, cualquiera de ellas puede ser números simples, y así evitar un anidado bucle for. Admito que soy nuevo en C#, así que por favor, si hay una razón para no hacerlo, por favor dígame...

3voto

Anthony Pegram Puntos 58528

El Array 2D en C# no se presta bien a un foreach anidado, no es el equivalente a un Array dentado (un Array de arrays). Podrías hacer algo como esto para usar un foreach

foreach (int i in Enumerable.Range(0, array.GetLength(0)))
    foreach (int j in Enumerable.Range(0, array.GetLength(1)))
        Console.WriteLine(array[i, j]);

Pero seguirías usando i y j como valores de índice para el Array. La legibilidad se preservaría mejor si se optara por la variedad de jardín for bucle en su lugar.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X