2012-08-04 45 views
11

Cuando trato de hacer esto ...Cómo modificar una variable de iteración foreach desde el bucle foreach?

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

... me sale Cannot assign to 'item' because it is a 'foreach iteration variable'.

Aún así, me gustaría hacer eso.

La idea es asignar valores predeterminados de clase Item al elemento existente.

+0

¿Por qué no sólo tiene que utilizar otra variable? – sczdavos

+0

@sczdavos ¿cómo exactamente? – user1306322

+0

'var myItem; foreach (elemento var en twoDimArray) myItem = new Item(); ' – sczdavos

Respuesta

18

Bien, ahora que sabemos que su objetivo en lugar de la forma en que estaba tratando de alcanzarlo, es mucho más fácil Responde tu pregunta: no deberías estar usando un bucle foreach. foreach es aproximadamente leyendo elementos de una colección - no cambia el contenido de una colección. Es un buen trabajo que el compilador de C# haga que la variable de iteración sea de solo lectura; de lo contrario, le hubiera permitido cambiar el valor de la variable sin que realmente cambie la colección. (No tendría que haber más cambios significativos para permitir cambios se reflejen ...)

sospecho que lo que desea es:

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

Eso está asumiendo que es una matriz rectangular (un Item[,]). Si se trata de un Item[][] entonces es una matriz de matrices, y que se encargaría de que de forma ligeramente diferente - muy posiblemente con una foreach para la repetición externa:

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

Veamos si esta vieja respuesta recibirá algo de atención. Su respuesta es obvia para una matriz bidimensional, pero ¿hay alguna respuesta inteligente para una matriz n-dimensional? – LamdaComplex

+0

@LamdaComplex: Bueno, podrías construir una matriz de índices e incrementarla de manera efectiva, o recurrir a ella. Te sugiero que hagas una nueva pregunta, con un breve pero completo ejemplo de lo que intentas lograr. –

0

Puede usar el ciclo normal para eso.

+0

No conozco las dimensiones. – user1306322

+0

es una matriz bidimensional, por lo que puede * averiguar * la longitud, ¿verdad? – Adam

+0

Entonces, ¿qué sigue? – user1306322

5

Sin saber el tamaño no es un problema:

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

Parece que usted está tratando de inicializar la matriz. No puede hacer eso de esta manera. En cambio, necesita recorrer el conjunto por índice.

Para inicializar los elementos de una matriz bidimensional dado, intente esto:

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