Как указывал @Dai, второе и третье высказывания должны оцениваться в конце каждой итерации.
Данное поведение подробно описано в §8.8.3 спецификации языка C#. Перефразировать, это говорит о
for (initialiser; condition; iterator;) { ... }
заявление:
А при заявлении выполняется следующим образом:
- Если для-инициализаторе присутствует, переменная инициализаторы или заявление выражения выполняются в том порядке, в котором они написаны. Этот шаг выполняется только один раз.
- Если присутствует условие, оно оценивается.
- Если для условия нет или если оценка дает значение true, управление передается встроенной инструкции. Когда и если элемент управления достигает конечной точки встроенного оператора, выражения for-iterator оцениваются последовательно, а затем выполняется другая итерация, начиная с оценки условия for на шаге выше.
- Если условие условия присутствует и оценка дает ложь, управление передается в конечную точку оператора for.
С кодом
for (
int i = reverse ? steps - 1 : 0;
reverse ? i >= 0 : i < steps;
i += reverse ? -1 : +1
) {
rotateScript.angles.Add(angleRange[0] + stepAdder * i);
}
у вас есть несколько вариантов, чтобы сделать тройной оператор на рич итерации ненужной.
Вы упомянули, используя if
/else
с двумя for
петель, но я полагаю, что вы этого не сделаете, потому что это дублирует код, который препятствует его ремонтопригодности и читаемость.
Вариант 1: Используйте стандартный for
цикл:
Вы можете поместить логику в код внутри цикла, т.е.
for (i = 0; i < steps; i += 1)
{
int multiplier = reverse ? steps - 1 - i: i;
rotateScript.angles.Add(angleRange[0] + stepAdder * multiplier);
}
Вариант 2: Перемещение термальная логика:
Вычислить предел и приращение первого, т.е.
int start = reverse ? steps - 1 : 0;
int increment = reverse ? -1 : +1;
int limit = reverse ? -1 : steps;
for (int i = start; i != limit; i += increment;)
{
rotateScript.angles.Add(angleRange[0] + stepAdder * i);
}
Я предпочитаю вариант 1, как я думаю, что большинство людей считают просто for
петли легче понять.
Мне понравился вариант 1, лучше, чем if/else с двумя циклами. Действительно хороший ответ, спасибо! –
Без проблем - рад помочь! Также большое спасибо за принятие моего ответа! :) –