仅在循环的所有迭代中满足条件时执行操作

New*_*404 32 c# for-loop

有没有办法只在循环的所有迭代中满足条件时触发动作for

例:

if ((i % 1 == 0) && (i % 2 == 0) && (...) && (i % 20 == 0))
{
    Do action x
}
Run Code Online (Sandbox Code Playgroud)

这是我尝试过的,但它没有按预期工作:

for (int b=1; b<21; b++)
{
    if (i % b == 0)
    {
        // Do something
    }
}
Run Code Online (Sandbox Code Playgroud)

Kin*_*tic 94

您还可以使用像这样的简单LINQ查询:

if (Enumerable.Range(1, 20).All(b => i % b == 0))
    DoAction();
Run Code Online (Sandbox Code Playgroud)


Sla*_*nov 88

有经典的解决方案:

var flag = true;
for(int b = 2; b < 21; b++)
{
     if (i % b != 0)
     {
         flag = false;
         break;
     }
}
if(flag)
   SomeAction():
Run Code Online (Sandbox Code Playgroud)

首先,我们假设,所有的条件(循环)得到满足:var flag = true.如果不满足至少一个条件:if (i % b != 0),我们停止循环过程:break;因为不需要继续检查和设置flag = false,现在通过flag变量我们知道我们检查的结果,并且可以在以后使用它来确定我们是否应该调用SomeAction().

  • @ BlueRaja-DannyPflughoeft提问者已经提出了几乎解决方案,向他们展示如何使他们的解决方案工作远比仅仅说"废弃并用这一行LINQ替换它"更有价值. (26认同)
  • -1这是最糟糕的答案,不知道为什么它被接受了.如果你对LINQ不利,那么__ast __将其提取到一个方法...... (5认同)
  • 你可以从b = 2开始循环 (4认同)
  • @ BlueRaja-DannyPflughoeft当Google员工将来到这里时,他们可能并非都在使用C#.我支持这个和LINQ答案,但是上下文很重要. (2认同)

Bar*_*rry 37

怎么样:

if (i % 232792560 == 0) {
    // do action
}
Run Code Online (Sandbox Code Playgroud)

如果你想检查你的号码是否可被大量数字整除,这相当于检查你的号码是否可以被所有这些号码的最小公倍数整除.在这种情况下,那是2 4*3 2*5*7*11*13*17*19.

  • 当您使用此号码时,请确保留下该号码的注释.这是迄今为止最好的答案. (17认同)
  • @Barry我认为他的意思是"在真实的源代码中留下评论",而不是在Stack Overflow上留下评论. (12认同)
  • 我相信这不能回答这个问题.这解决了示例所带来的问题,但实际问题是关于您有多个条件并希望对所有条件采取行动的一般情况.如果我来这里想"很棒,有一堆检查要做,我怎么能简化这个",那么你的回答对我来说就没用了.如果问题是"如何检查一个数字是否可以被大量数字整除",那么你就明白了. (11认同)
  • 魔数......请不要. (8认同)
  • @Barry当然,您已经解决了每个来到这里的人的问题,他们知道数字是否可以被2-20整除。请注意,不是整个人口统计信息,而是您当中只有那些使用“圈内行动”(或类似形式)作为搜索字词专门搜索了问题的人。虽然这些人可能会很感激,但我认为他们将是参加咨询的总人数的一小部分。 (2认同)
  • @Barry为什么我不能_also_评论?评论在这里是有原因的.如果你不觉得它们有用,你可以自由地忽视它们,就是这样. (2认同)

Goo*_*ide 25

所以你想链接一些非常相似的布尔表达式,而不是明确地写出它们.

if ((i % 1 == 0) && (i % 2 == 0) && (...) && (i % 20 == 0))
{
    do action x
}
Run Code Online (Sandbox Code Playgroud)

您可以做的第一件事是将if语句中使用的组合表达式提取到一个新函数中.这使您的代码更具可读性.

public static void Main()
{
    // ...

    if (DivisibleByAllUpTo20(i))
    {
        //do action x
    }

    // ...
}

private static bool DivisibleByAllUpTo20(int i)
{
    return (i % 1 == 0) && (i % 2 == 0) && (...) && (i % 20 == 0);
}
Run Code Online (Sandbox Code Playgroud)

DivisibleByAllUpTo20()然后可以for像你尝试过的循环一样实现.

private static bool DivisibleByAllUpTo20(int i)
{
    for (int b = 1; b < 21; b++)
    {
        if (i % b != 0)
            return false;
    }

    return true;
}
Run Code Online (Sandbox Code Playgroud)

顺便说一句:LINQ命名空间提供了许多帮助方法,使您可以更简洁,更清晰地编写此类代码:

using System.Linq;

// ...

if (Enumerable.Range(1, 20).All(n => n % i == 0))
{
    // do action x
}
Run Code Online (Sandbox Code Playgroud)

  • 这是最完整的答案; 它向OP展示了如何以他们想要的方式完成它但却无法完成,但也向LINQ介绍了他们和未来的读者. (3认同)

Him*_*ere 11

简单:

bool isDividable = true;
for(int b=1; b<21; b++)
{
     if (i % b != 0)
     {
         isDividable = false;
         break;
     }
}

if(isDividable) do something
Run Code Online (Sandbox Code Playgroud)


Ale*_*lev 5

bool flag = true;
for(int b=1; b < 21 && (flag &= (i % b == 0)) ; b++)
    ;
if(flag)
   do_action();//do your task
Run Code Online (Sandbox Code Playgroud)

  • @HimBromBeere如果为Obsfuscated C#Code Contest写作,那么肯定.否则,通常这样的代码会激怒那些必须理解或维护它的人.我并不是说它在技术上并不聪明或有效,但是这些技巧通常不会在可持续的代码库中持续很长时间,这是有充分理由的......尤其是在像C#这样的高级语言中(也就是说我可能更了解C语言)哪里有更好的表达意图的方式.即使添加了缺失的注释,这也不如显式写入或调用良好的库函数那么自我记录. (13认同)