Как я понимаю, переменная итерации С# foreach неизменна.
Это означает, что я не могу изменить итератор следующим образом:
foreach (Position Location in Map)
{
//We want to fudge the position to hide the exact coordinates
Location = Location + Random(); //Compiler Error
Plot(Location);
}
Я не могу напрямую изменять переменную итератора, и вместо этого я должен использовать цикл for
for (int i = 0; i < Map.Count; i++)
{
Position Location = Map[i];
Location = Location + Random();
Plot(Location);
i = Location;
}
Исходя из фона С++, я вижу foreach как альтернативу циклу for. Но с указанным выше ограничением я обычно отказываюсь от использования цикла for.
Мне любопытно, что является основанием для того, чтобы сделать итератор неизменным?
Изменить:
Этот вопрос является скорее вопросом любопытства, а не вопросом кодирования. Я оценил ответы на кодирование, но не могу отметить их как ответы.
Кроме того, приведенный выше пример был слишком упрощен. Вот пример С++, который я хочу сделать:
// The game rules:
// - The "Laser Of Death (tm)" moves around the game board from the
// start area (index 0) until the end area (index BoardSize)
// - If the Laser hits a teleporter, destroy that teleporter on the
// board and move the Laser to the square where the teleporter
// points to
// - If the Laser hits a player, deal 15 damage and stop the laser.
for (int i = 0; i < BoardSize; i++)
{
if (GetItem(Board[i]) == Teleporter)
{
TeleportSquare = GetTeleportSquare(Board[i]);
SetItem(Board[i], FreeSpace);
i = TeleportSquare;
}
if (GetItem(Board[i]) == Player)
{
Player.Life -= 15;
break;
}
}
Я не могу сделать выше в С# foreach, потому что итератор я неизменен. Я думаю (исправьте меня, если я ошибаюсь), это характерно для дизайна foreach на языках.
Мне интересно, почему итератор foreach неизменен.