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

C# 仅当在循环的所有迭代中满足条件时才执行操作,c#,for-loop,C#,For Loop,是否有一种方法仅在for循环的所有迭代中满足条件时触发操作 例如: if ((i % 1 == 0) && (i % 2 == 0) && (...) && (i % 20 == 0)) { Do action x } 这是我尝试过的,但没有达到预期效果: for (int b=1; b<21; b++) { if (i % b == 0) { // Do something } } for

是否有一种方法仅在
for
循环的所有迭代中满足条件时触发操作

例如:

if ((i % 1 == 0) && (i % 2 == 0) && (...) && (i % 20 == 0))
{
    Do action x
}
这是我尝试过的,但没有达到预期效果:

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

希望有帮助。:

有一个经典的解决方案:

var flag = true;
for(int b = 2; b < 21; b++)
{
     if (i % b != 0)
     {
         flag = false;
         break;
     }
}
if(flag)
   SomeAction():
var标志=true;
对于(intb=2;b<21;b++)
{
如果(i%b!=0)
{
flag=false;
打破
}
}
国际单项体育联合会(旗)
SomeAction():
首先,我们假设满足所有条件(循环):
var flag=true
。 若至少有一个条件未满足:
若(i%b!=0)
,则停止循环进程:
中断
因为不需要继续检查,并且设置
flag=false
,现在通过
flag
变量,我们知道检查的结果,可以稍后使用它来确定是否调用
SomeAction()

简单:

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

if(isDividable) do something
bool isDividable=true;

对于(intb=1;b你可以这样写

bool doAction = true;
for(int b=1;b<21;b++)
{
  if (!(i % b == 0))
    {
      doAction = false;
    } 
}
if (doAction)
{
  do action x;
}

说明:Enumerable.Range返回一个值为1到20的数组和。All检查每个对象的Lambda表达式。

您也可以使用类似以下的简单LINQ查询:

if (Enumerable.Range(1, 20).All(b => i % b == 0))
    DoAction();

因此,您希望链接许多非常相似的布尔表达式,而无需显式编写它们

if ((i % 1 == 0) && (i % 2 == 0) && (...) && (i % 20 == 0))
{
    do action x
}
您可以做的第一件事是将
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);
}
DivisibleByAllUpTo20()
然后可以像您尝试的那样使用
for
循环来实现

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

    return true;
}
bool标志=true;
对于(intb=1;b<21&&(flag&=(i%b==0));b++)
;
国际单项体育联合会(旗)
do_action();//完成您的任务
只需:

if (i % 232792560 == 0) {
    // do action
}

如果你想检查你的数字是否可以被许多数字整除,这相当于检查你的数字是否可以被所有这些数字的最小公倍数整除。在本例中,这是24*32*5*7*11*13*17*19。

这里有很多类似的答案使用标志。一个更简单的解决方案是使用循环变量(
b
在您的问题中)作为测试条件:

int b;
int max = 20;

for (b = 1; b <= max && i % b == 0; ++b) ;

if (b > max) {
    // do something
}
intb;
int max=20;
对于(b=1;b最大值){
//做点什么
}

For循环不返回任何内容。你的意思是当For循环中的所有条件都正确时?首先,你可以省略所有非素数,因为它们是冗余的。@Bernhard遗漏具有重复因子的复合会改变结果,例如OP code要求16和9是i的因子,但它们都不是素数。你可以测试i%232792560,但这不是问题。有人能解释投票数吗?@oarfish一些任意算法将其选为“热门网络问题”,所以它在整个Stack Exchange网络的侧边栏中突出显示,在so和所有其他SE网站上向各地的读者进行广告宣传-他们可能对我们网站上的问题质量不是很好的评判。说得清楚,我并不是说这是一个特别糟糕的问题,尽管措辞含糊不清-但绝对不是+22问题either.你可以从b=2-1开始循环,这是最糟糕的答案,不知道为什么会被接受。如果你对LINQ不利,至少可以将其提取到一个方法中…@BlueRaja DannyPflughoeft,提问者在这里提出了一个几乎解决方案,向他们展示如何使其解决方案有效远比仅仅说出来更有价值“扔掉它,换上这一行LINQ"@BlueRaja DannyPflughoeft当谷歌人将来来到这里时,他们可能并不都使用C#。我对这一点和LINQ的答案投了更高的票,但上下文很重要。@BlueRaja DannyPflughoeft抱歉没有看到这一点。这绝对应该被提取到一个方法中。但我认为展示如何用任何语言实现这一点是重要的部分。Barry的答案是C#特定的,这很好,因为问题被标记为C#。但通过谷歌搜索“所有循环迭代通过执行操作”或类似内容将不可避免地导致用户出现这个问题,并且他们可能没有使用C#:)@HimBromBeere如果为混乱的C#代码竞赛写作,那当然。否则,像这样的代码通常只会激怒任何需要理解或维护它的人。我并不是说它在技术上不聪明或不有效,但这种技巧通常不会在可持续的代码库中持续很长时间,这是有充分理由的……尤其是在更高级别的代码库中像C#这样的语言(也就是说,用C我可能会理解得更多)这里有更好的表达意图的方法。即使添加了缺少的注释,也不会像显式编写或调用好的库函数那样进行自我记录。我同意&=在for语句中可能有点不必要,可以移动到主体中,以避免激怒某些正在使用它的人对复杂的逻辑过敏。到目前为止,这仍然是这个问题的最佳答案。实际上比fors中所有疯狂的IFFER都好10倍。使用此选项时,请务必在数字来源处留下注释。这是迄今为止最好的答案。@Barry我想他的意思是“在真正的源代码中留下注释”,在这里不要对堆栈溢出发表评论。我相信这并不能回答问题。这解决了示例提出的问题,但实际问题是关于一般情况,在这种情况下,您有多个条件,并且希望对所有条件都采取行动。如果我来这里思考“太好了,有一大堆的检查要做,我怎么能简化这个”,那么你的回答对我来说是无用的。问题是“如何检查一个数字是否可以被许多数字整除?”“,你说得对。神奇数字……请不要。@Barry,你已经解决了每一个来这里想知道一个数字是否可以被2-20整除的人的问题。记住,不是整个人口统计,而是你,只有那些专门用“循环中的动作”(或类似)作为搜索词用谷歌搜索他们的问题的人。Whi?”
private static bool DivisibleByAllUpTo20(int i)
{
    for (int b = 1; b < 21; b++)
    {
        if (i % b != 0)
            return false;
    }

    return true;
}
using System.Linq;

// ...

if (Enumerable.Range(1, 20).All(n => n % i == 0))
{
    // do action x
}
bool flag = true;
for(int b=1; b < 21 && (flag &= (i % b == 0)) ; b++)
    ;
if(flag)
   do_action();//do your task
if (i % 232792560 == 0) {
    // do action
}
int b;
int max = 20;

for (b = 1; b <= max && i % b == 0; ++b) ;

if (b > max) {
    // do something
}