C #: Невозможно присвоить переменной итерации foreach - PullRequest
1 голос
/ 04 февраля 2010

Я пытаюсь сжать это, обернув его в цикл:

       if (pos.X + pixelRadius < 0) {
            pos.X = bounds.Width - pixelRadius;
        } else if (pos.X + pixelRadius > bounds.Width) {
            pos.X = pixelRadius;
        }

        if (pos.Y + pixelRadius < 0) {
            pos.Y = bounds.Heigh - pixelRadius;
        } else if (pos.Y + pixelRadius > bounds.Height) {
            pos.Y = pixelRadius;
        }

Мой первый инстинкт был сделать что-то вроде этого:получить сообщение об ошибке:

Cannot assign to 'coord' because it is a 'foreach iteration variable'

Можно ли как-нибудь обернуть этот код в цикл?Или, может быть, это не стоит затраченных усилий, и его удобнее читать в первой форме.

Для тех, кому интересно: да, это реализация обхода.

Ответы [ 5 ]

6 голосов
/ 04 февраля 2010

Честно говоря, я думаю, что первая версия более читабельна.Вторая версия объединяет данные в цикле и затем ... проверяет, какой это элемент цикла ???Пахнет for...case антипаттерном для меня.

4 голосов
/ 04 февраля 2010

Я думаю, что это попытка сделать по модулю математику, так что это действительно то, что вы хотите

pos.X %= bounds.Width;
pos.Y %= bounds.Height;

Это не дает точно такое же поведение, как приведенный выше код, но это может быть, если вы просто настроитьграницы и применить смещение к точке, прежде чем делать по модулю.

или это, если вам нужно смещение

pos.X = ((pos.X - pixelRadius) % bounds.Width) + pixelRadius;
pos.Y = ((pos.Y - pixelRadius) % bounds.Height) + pixelRadius;

Математика по модулю является лучшим способом сделать обтекание.Это яснее и не имеет разветвлений.

3 голосов
/ 04 февраля 2010

Даже если бы вы могли изменить координаты, так как это float, вы бы просто изменили копию, а не значение в pos.Лучше всего создать новый метод.

0 голосов
/ 04 февраля 2010

Цикл - плохая идея.

Код, который вы сейчас имеете, выглядит глючно, но его структура лучше, чем неестественное использование цикла.

Если я понимаю, что выпытаюсь сделать, я думаю, у вас должно быть что-то вроде этого

(я фокусируюсь на координате X. В случае координаты Y это аналогично)

pos.X += pixelRadius;
if(pos.X < 0) {
    pos.X += bounds.Width;
} else if (pos.X > bounds.Width) {
    pos.X -= bounds.Width;           
}

Это будет работать, если |pixelRadius |

Оператор модуля немного облегчает работу, особенно если | pixelRadius |> bounds.With, но будьте осторожны в случае отрицательных чисел.Вы должны точно знать, что будет делать с ними ваша языковая реализация

Используя оператор модуля, я бы сделал это следующим образом

pos.X = (pos.X + pixelRadius) % bounds.Width;
if(pos.X < 0) pos.X += bounds.Width;
0 голосов
/ 04 февраля 2010

Я бы оставил его в первоначальном виде. Когда вы находитесь в цикле, как указано выше, coord является COPY переменной pos.X или pos.Y, поскольку они Типы значений . Это означает, что даже если бы вы могли обновить координаты ... вы бы не обновляли pos.X или pos.Y, а копировали бы их локально в цикл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...