2012-08-04 10 views
11

Quando provo a fare questo ...Come modificare una variabile di iterazione foreach dall'interno del ciclo 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(); 
} 

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

Ancora, mi piacerebbe farlo.

L'idea è di assegnare i valori di classe Item predefiniti all'elemento esistente.

+0

Perchè non basta usare un'altra variabile? – sczdavos

+0

@sczdavos come esattamente? – user1306322

+0

'var myItem; foreach (var item in twoDimArray) myItem = new Item(); ' – sczdavos

risposta

18

Okay, ora che sappiamo che la vostra mirare invece di come si stava tentando di raggiungerlo, è molto più facile per rispondi alla tua domanda: non dovresti utilizzare un ciclo foreach. foreach è circa leggendo elementi da una raccolta - non modifica il contenuto di una raccolta. È un buon lavoro che il compilatore C# renda la variabile di iterazione di sola lettura, altrimenti ti permetterebbe di cambiare il valore della variabile senza che in realtà cambiasse la collezione. (Ci sarebbe dovuto essere più cambiamenti significativi per consentire modifiche vengano riflesse ...)

Ho il sospetto che si desidera solo:

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

che è ammesso che sia una matrice rettangolare (una Item[,]). Se si tratta di un Item[][] allora è un array di array, e si sarebbe gestire che in modo leggermente diverso - molto probabilmente con un foreach per l'iterazione esterna:

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

Vediamo se questa vecchia risposta avrà un po 'di attenzione. La tua risposta è ovvia per un array bidimensionale, ma c'è una risposta intelligente per un array n-dimensionale? – LamdaComplex

+0

@LamdaComplex: beh, è ​​possibile creare una serie di indici ed incrementare efficacemente tale valore oppure utilizzare la ricorsione. Ti suggerisco di fare una nuova domanda, con un breve ma completo esempio di ciò che stai cercando di ottenere. –

0

È possibile utilizzare il ciclo normale per quello.

+0

Non conosco le dimensioni. – user1306322

+0

è un array bidimensionale, quindi è possibile * scoprire * la lunghezza, giusto? – Adam

+0

E poi cosa? – user1306322

5

Non conoscendo la dimensione non è un problema:

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

Sembra che si sta cercando di inizializzare l'array. Non è possibile farlo in questo modo. Invece, è necessario scorrere l'array per indice.

Per inizializzare gli elementi di un dato array bidimensionale, provate questo:

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