17

これをやろうとすると…

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アイデアは、デフォルトのクラス値を既存のアイテムに割り当てることです。

4

4 に答える 4

24

さて、あなたがそれを達成しようとしていた方法ではなく、あなたの目的がわかったので、あなたの質問に答えるのははるかに簡単です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();
    }
}

これは、それが矩形配列 (an Item[,]) であると想定しています。それが の場合、Item[][]それは配列の配列であり、それを少し異なる方法で処理します - おそらくforeach外側の反復の a を使用します。

foreach (var subarray in array)
{
    for (int i = 0; i < subarray.Length; i++)
    {
        subarray[i] = new Item();
    }
}
于 2012-08-04T18:03:06.353 に答える
6

サイズがわからないことは問題ではありません。

for (int i = 0; i < twoDimArray.GetLength(0); i++)
{
    for (int j = 0; j < twoDimArray.GetLength(1); j++)
    {
        twoDimArray[i, j] = ...
    }
}
于 2012-08-04T18:00:51.433 に答える
2

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

特定の 2 次元配列の要素を初期化するには、次のようにします。

for (int d = 0; d < array.GetLength(0); d++)
{
    for (int i = 0; i < array.GetLength(1); i++)
    {
        array[d, i] = new Item();
    }
}
于 2012-08-04T18:01:07.573 に答える
1

そのために通常の for ループを使用できます。

于 2012-08-04T17:57:14.683 に答える