for循环根据步长的符号覆盖范围增加/减少

时间:2019-03-01 14:36:10

标签: c# for-loop

我将如何修改此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 + " ");
}

6 个答案:

答案 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 + " ");
}

DotNetFiddle

答案 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您只需要更新循环条件即可。