web-dev-qa-db-fra.com

Itérer tableau multidimensionnel avec déclaration imbriquée Foreach

Je pense que cela pourrait être une question assez simple, mais je n’ai pas encore été capable de la comprendre. Si j'ai un tableau à 2 dimensions comme ceci:

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

Quelle est la meilleure façon de parcourir chaque dimension du tableau avec une instruction imbriquée foreach ?

60
Tyler Murry

Si vous voulez parcourir chaque élément du tableau comme s'il s'agissait d'un tableau aplati, vous pouvez simplement faire:

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

qui imprimerait

123456

Si vous souhaitez également connaître les index x et y, vous devez procéder comme suit:

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

Sinon, vous pouvez utiliser un tableau en escalier à la place (un tableau de tableaux):

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

ou

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]);
    }
}
105
ICR

Voici comment visiter chaque élément dans un tableau à 2 dimensions. Est ce que c'est ce que vous recherchiez?

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

Je sais que ce message est ancien, mais je l’ai trouvé par le biais de Google. Après avoir joué, j’ai trouvé une solution plus simple. Si je me trompe, veuillez le préciser, car j'aimerais savoir, mais cela a au moins fonctionné pour moi (c'est basé sur la réponse d'ICR):

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

Les deux dimensions étant limitées, l'une ou l'autre peut être constituée de simples nombres et éviter ainsi une boucle for imbriquée. J'admets que je suis nouveau en C #, alors s'il vous plaît, s'il y a une raison pour ne pas le faire, dites-moi s'il vous plaît ...

4
Keven M

Avec les tableaux multidimensionnels, vous pouvez utiliser la même méthode pour parcourir les éléments, par exemple:

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

La sortie de cet exemple est:

9 99 3 33 5 55

Références


En Java, les tableaux multidimensionnels sont des tableaux de tableaux. Ainsi, les éléments suivants fonctionnent:

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

Le tableau 2D en C # ne se prête pas bien à un imbriqué, ce n’est pas l’équivalent d’un tableau dentelé (un tableau de tableaux). Vous pouvez faire quelque chose comme ça pour utiliser 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]);

Mais vous utiliseriez toujours i et j comme valeurs d'index pour le tableau. La lisibilité serait mieux préservée si vous optez pour la boucle de variété de jardin for.

3
Anthony Pegram

Deux manières:

  1. Définissez le tableau en tant que tableau dentelé et utilisez des foreach imbriqués.
  2. Définissez le tableau normalement et utilisez foreach sur le tout.

Exemple de # 2:

int[,] arr = { { 1, 2 }, { 3, 4 } };
foreach(int a in arr)
    Console.Write(a);

La sortie sera 1234. ie. exactement la même chose que de faire i de 0 à n et j de 0 à n.

2
Rubys

Vous pouvez utiliser une méthode d'extension comme ceci:

internal static class ArrayExt
{
    public static IEnumerable<int> Indices(this Array array, int dimension)
    {
        for (var i = array.GetLowerBound(dimension); i <= array.GetUpperBound(dimension); i++)
        {
            yield return i;
        }
    }
}

Et alors:

int[,] array = { { 1, 2, 3 }, { 4, 5, 6 } };
foreach (var i in array.Indices(0))
{
    foreach (var j in array.Indices(1))
    {
        Console.Write(array[i, j]);
    }

    Console.WriteLine();
}

Ce sera un peu plus lent que d'utiliser des boucles for, mais ce n'est probablement pas un problème dans la plupart des cas. Je ne sais pas si cela rend les choses plus lisibles.

Notez que les tableaux c # peuvent ne pas être basés sur zéro, vous pouvez donc utiliser une boucle for comme ceci:

int[,] array = { { 1, 2, 3 }, { 4, 5, 6 } };
for (var i = array.GetLowerBound(0); i <= array.GetUpperBound(0); i++)
{
    for (var j= array.GetLowerBound(1); j <= array.GetUpperBound(1); j++)
    {
        Console.Write(array[i, j]);
    }

    Console.WriteLine();
}
2
Johan Larsson

Utilisez LINQ .Cast<int>() pour convertir un tableau 2D en IEnumerable<int>.

Exemple LINQPad:

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

IEnumerable<int> values = arr.Cast<int>();
Console.WriteLine(values);

Sortie:

 Sequence is 1,2,3,4,5,6

1
angularsen

Vous pouvez également utiliser des énumérateurs. Chaque type de tableau d'une dimension prend en charge la méthode Array.GetEnumerator. Le seul inconvénient est que vous devrez faire face à la boxe/unboxing. Cependant, le code que vous devez écrire sera assez trivial.

Voici l'exemple de code:

class Program
{
    static void Main(string[] args)
    {
        int[,] myArray = new int[,] { { 1, 2 }, { 3, 4 }, { 5, 6 } };
        var e = myArray.GetEnumerator();

        e.Reset();

        while (e.MoveNext())
        {
            // this will output each number from 1 to 6. 
            Console.WriteLine(e.Current.ToString());
        }

        Console.ReadLine();
    }
}
0
code4life

Comme mentionné précédemment, vous pouvez simplement parcourir le tableau et il produira tous les résultats dans l'ordre, dans toutes les dimensions. Toutefois, si vous souhaitez également connaître les index, pourquoi ne pas utiliser cet - http://blogs.msdn.com/b/ericlippert/archive/2010/06/28/computing-a-cartesian-product- avec linq.aspx

puis faire quelque chose comme:

var dimensionLengthRanges = Enumerable.Range(0, myArray.Rank).Select(x => Enumerable.Range(0, myArray.GetLength(x)));
var indicesCombinations = dimensionLengthRanges.CartesianProduct();

foreach (var indices in indicesCombinations)
{
    Console.WriteLine("[{0}] = {1}", string.Join(",", indices), myArray.GetValue(indices.ToArray()));
}
0
Daniel Smith
int[,] arr =  { 
                {1, 2, 3},
                {4, 5, 6},
                {7, 8, 9}
              };
 for(int i = 0; i < arr.GetLength(0); i++){
      for (int j = 0; j < arr.GetLength(1); j++)
           Console.Write( "{0}\t",arr[i, j]);
      Console.WriteLine();
    }

output:  1  2  3
         4  5  6
         7  8  9
0
Sohel Ahmed