2012-08-04 149 views
11

當我試圖做到這一點...如何修改foreach循環中的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(); 
} 

...我得到Cannot assign to 'item' because it is a 'foreach iteration variable'

不過,我想這樣做。

這個想法是爲現有項目分配默認的Item類值。

+0

你爲什麼不只是使用另一個變量? – sczdavos 2012-08-04 17:56:36

+0

@sczdavos究竟如何? – user1306322 2012-08-04 17:56:57

+0

'var myItem; foreach(var in twoDimArray) myItem = new Item();' – sczdavos 2012-08-04 17:57:58

回答

18

好了,現在我們知道你的目標,而不是你如何試圖去實現它,這是對容易得多回答你的問題:你不應該使用foreach循環。 foreach讀取項目從集合 - 不改變集合的內容。 C#編譯器使迭代變量爲只讀是一件好事,否則它會允許您更改變量的值,而不會實際更改集合。 (這裏不得不更加顯著的改變,以允許反映變化...)

我懷疑你只是想:

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

這是假設它是一個矩形陣列(一個Item[,])。如果它是一個Item[][]那麼它是一個數組的數組,你會處理這個略有不同 - 很可能與foreach的外部循環:

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

讓我們看看這個舊的答案是否會得到一些關注。你的答案對於二維數組是顯而易見的,但是對於一個n維數組有一個聰明的答案? – LamdaComplex 2015-11-25 21:17:10

+0

@LamdaComplex:那麼你可以構建一個索引數組,並有效地遞增 - 或使用遞歸。我建議你問一個新問題,用一個簡短但完整的例子來說明你想要達到的目標。 – 2015-11-25 22:20:27

0

你可以使用正常for循環。

+0

我不知道尺寸。 – user1306322 2012-08-04 17:57:38

+0

這是一個二維數組,所以你可以*找出*長度,對吧? – Adam 2012-08-04 17:58:22

+0

接下來呢? – user1306322 2012-08-04 17:59:03

5

不知道大小不是問題:

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

它看起來像你想初始化數組。 你不能這樣做。相反,您需要按索引遍歷數組。

要初始化一個給定的二維數組中的元素,試試這個:

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