Comment modifier une variable d’itération foreach depuis une boucle foreach?

Quand j’essaie de faire ça …

Item[,] array = new Item[w, h]; // Two dimensional array of class Item, // w, h are unknown at comstack time. foreach(var item in array) { item = new Item(); } 

… Je Cannot assign to 'item' because it is a 'foreach iteration variable' .

Pourtant, j’aimerais faire ça.

L’idée est d’assigner des valeurs de classe d’ Item par défaut à un élément existant.

Bon, maintenant que nous connaissons votre objective au lieu de savoir comment vous avez essayé de l’atteindre, il est beaucoup plus facile de répondre à votre question: vous ne devriez pas utiliser une boucle foreach . foreach consiste à lire des éléments d’une collection et non à en modifier le contenu. C’est un bon travail que le compilateur C # rend la variable d’itération en lecture seule, sinon il vous aurait permis de modifier la valeur de la variable sans modifier réellement la collection. (Il faudrait des changements plus importants pour que les changements soient reflétés …)

Je suppose que vous voulez juste:

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

Cela suppose qu’il s’agit d’un tableau rectangular (un Item[,] ). Si c'est un Item[][] alors c'est un tableau de tableaux, et vous le manipuleriez légèrement différemment - très probablement avec un foreach pour l'itération externe:

 foreach (var subarray in array) { for (int i = 0; i < subarray.Length; i++) { subarray[i] = new Item(); } } 

Ne pas connaître la taille n’est pas un problème:

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

On dirait que vous essayez d’initialiser le tableau. Vous ne pouvez pas faire ça de cette façon . Au lieu de cela, vous devez parcourir le tableau par index.

Pour initialiser les éléments d’un tableau à deux dimensions, essayez ceci:

 for (int d = 0; d < array.GetLength(0); d++) { for (int i = 0; i < array.GetLength(1); i++) { array[d, i] = new Item(); } } 

Vous pouvez utiliser normal for loop pour cela.