Просто соблюдайте принцип KISS .
Вы можете просто поместить логику в инициализатор и выполнить условие for
:
public static void ForLoopWithDirectionBasedOnStep(int minValue, int maxValue, int step)
{
// Avoid obvious hang
if ( step == 0 )
throw new ArgumentException("step cannot be zero");
// ( initialiser ; condition ; iterator )
for ( int i = step > 0 ? minValue : maxValue; minValue <= i && i <= maxValue; i += step )
Console.Write(i + " ");
}
так:
ForLoopWithDirectionBasedOnStep(minValue: 2, maxValue: 10, step: 2)
возвращает:
2 4 6 8 10
ForLoopWithDirectionBasedOnStep(minValue: 2, maxValue: 10, step: -2)
возвращает:
10 8 6 4 2
по желанию.
Инициализатор устанавливает начальное значение
int i = step > 0 ? minValue : maxValue;
, используя условный оператор и эквивалентно
int i;
if ( step > 0 )
i = minValue;
else
i = maxValue;
Условие
minValue <= i && i <= maxValue
просто проверяет, что переменная цикла находится в диапазоне [minValue, maxValue].
Примечаниечто неправильные входные данные обрабатываются автоматически, потому что (выделение мое):
Раздел условия, если он присутствует, должен быть логическим выражением. Это выражение вычисляется перед каждой итерацией цикла.
, поэтому что-то вроде ForLoopWithDirectionBasedOnStep(minValue: 10, maxValue: 0, step: -2)
, которое будет отсчитываться от 0
до 10
, ничего не печатает, потому что, поскольку0 <10, тело оператора <code>for никогда не выполняется.