我将如何修改此for循环,以使其对Step
的正值递增计数,而对Step
的负值递减计数?
对于Step = 2
,预期输出为2 4 6 8 10
对于Step =- 2
,预期输出为10 8 6 4 2
// assume these 3 come from user input
int Lower = 2;
int Upper = 10;
int Step = 2;
for ( int i = Lower; i <= Upper; i += Step )
{
Console.Write(i + " ");
}
答案 0 :(得分:2)
您需要执行预处理步骤才能更改for循环中的比较及其限制
int Lower = 2;
int Upper = 10;
int Step = -2;
Func<int, bool> comparator = (j) => j <= Upper;
if (Step < 0)
{
var temp = Lower;
Lower = Upper;
Upper = temp;
comparator = (j) => j >= Upper;
}
for(int i=Lower; comparator(i); i+=Step)
{
Console.Write(i + " ");
}
答案 1 :(得分:2)
只需遵守KISS principle。
您只需将逻辑放入初始化程序和for
statement的条件中即可:
15
如此:
-2
返回:
14
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
通过使用conditional operator等效于
ForLoopWithDirectionBasedOnStep(minValue: 2, maxValue: 10, step: -2)
条件
10 8 6 4 2
仅检查循环变量是否在[minValue,maxValue]范围内。
请注意,错误输入会自动处理,因为(强调我):
条件部分(如果存在)必须为布尔表达式。 该表达式在每次循环迭代之前进行求值。
像int i = step > 0 ? minValue : maxValue;
这样从int i;
if ( step > 0 )
i = minValue;
else
i = maxValue;
倒数到minValue <= i && i <= maxValue
的东西不会打印任何内容,因为从0 <10开始,ForLoopWithDirectionBasedOnStep(minValue: 10, maxValue: 0, step: -2)
语句的主体是从未执行过。
答案 2 :(得分:1)
您可以根据step
变量的符号执行两个for循环:
static void Main(string[] args)
{
int lower = 2;
int upper = 10;
int step = -2;
if (Math.Sign(step) == 1)
{
for (int i = step; i < upper; i += step)
{
Console.WriteLine(string.Format("{0}", i));
}
}
else if (Math.Sign(step) == -1)
{
for (int i = upper; i >= lower; i += step)
{
Console.WriteLine(string.Format("{0}", i));
}
}
Console.ReadLine();
}
}
答案 3 :(得分:0)
请注意,该代码未经测试,但是其想法是使用Predicate<T>
进行循环,如果step为负,则切换Upper和Lower
// assume these 3 come from user input
int Lower = 2;
int Upper = 10;
int Step = 2;
if(step < 0){ int temp = Lower; Lower = Upper; Upper = temp;}
Predicate<int> LoopPred = (i =>
{
if(Step < 0)
return i >= Upper;
return i <= Upper;
})
for(int i=Lower; LoopPred(i); i+=Step)
{
Console.Write(i + “ “);
}
答案 4 :(得分:0)
您可以使Func委托检查步骤是否为负,并反转绑定的检查条件。
这里是一个示例:
class Program
{
public static void Print(int Lower, int Upper, int Step)
{
Func<int, bool> checkBounds = (i) => i <= Upper;
if (Step < 0)
{
Swap(ref Lower, ref Upper);
checkBounds = (i) => i >= Upper;
}
for (int i = Lower; checkBounds(i); i += Step)
Console.Write($"{i} ");
}
public static void Swap<T>(ref T a, ref T b)
{
T temp = a;
a = b;
b = temp;
}
static void Main(string[] args)
{
// assume these 3 come from user input
int Lower = 2;
int Upper = 10;
int Step = -2;
Print(Lower, Upper, Step);
}
}
答案 5 :(得分:0)
for(int i=Step>0?Lower:Upper; Step>0? i<=Upper: i>= Lower; i+=Step)
{
Console.Write(i + " ");
}
@john您只需要更新循环条件即可。