web-dev-qa-db-ja.com

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クラス値を割り当てることです。

15
user1306322

さて、これでaimがわかったので、それを達成しようとしていた方法ではなく、foreachループを使用しないでください。 foreachは約readingコレクションのアイテムです-コレクションの内容は変更しません。 C#コンパイラーが反復変数を読み取り専用にすることは良い仕事です。それ以外の場合は、実際にコレクションを変更せずにvariableの値を変更できます。 (変更を反映させるには、もっと重要な変更が必要です...)

私はあなたがただ望んでいると思います:

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();
    }
}
21
Jon Skeet

サイズを知らなくても問題ありません。

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

配列を初期化しようとしているようです。 この方法ではできません。代わりに、配列をインデックスでループする必要があります。

指定された2次元配列の要素を初期化するには、次のことを試してください。

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

通常のforループを使用できます。

0
Pompair