Как изменить переменную итерации 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 для существующего элемента.

Ответ 1

Хорошо, теперь, когда мы знаем вашу цель вместо того, как вы пытались ее достичь, гораздо легче ответить на ваш вопрос: вы не должны использовать цикл foreach. foreach - это чтение элементов из коллекции - не изменение содержимого коллекции. Хорошо, что компилятор С# делает переменную итерации только для чтения, иначе она позволила бы вам изменить значение переменной без фактического изменения коллекции. (Там должны быть более существенные изменения, позволяющие отражать изменения...)

Я подозреваю, что вы просто хотите:

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

Предположим, что это прямоугольный массив (a Item[,]). Если это Item[][], то это массив массивов, и вы будете обрабатывать его несколько иначе - возможно, с foreach для внешней итерации:

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

Ответ 2

Не знаю, размер не является проблемой:

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

Ответ 3

Похоже, вы пытаетесь инициализировать массив. Вы не можете так поступать. Вместо этого вам нужно пройти через массив по индексу.

Чтобы инициализировать элементы заданного двумерного массива, попробуйте следующее:

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

Ответ 4

Для этого можно использовать обычный цикл.