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 ?
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]);
}
}
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];
}
}
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 ...
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
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);
}
}
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
.
Deux manières:
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.
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();
}
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();
}
}
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()));
}
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