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[][]那么它是一个数组数组,你的处理方式会略有不同——很可能是用 aforeach进行外部迭代:

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

看起来您正在尝试初始化数组。你不能那样做。相反,您需要按索引遍历数组。

要初始化给定二维数组的元素,请尝试以下操作:

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 回答