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

本文关键字:条件 满足 操作 执行 循环 迭代 | 更新日期: 2023-09-27 18:02:20

有没有办法只在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
    }
}

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

您还可以使用简单的 LINQ 查询,如下所示:

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

有经典的解决方案:

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

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

怎么样只是:

if (i % 232792560 == 0) {
    // do action
}
如果你想检查你的数字是否可以被很多数字整除

,这相当于检查你的数字是否可以被所有这些数字中最不常见的倍数整除。在本例中,即 24*32*5*7*11*13*17*19。

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

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);
}

然后,可以使用for循环实现DivisibleByAllUpTo20()就像您尝试的那样。

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

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

using System.Linq;
// ...
if (Enumerable.Range(1, 20).All(n => n % i == 0))
{
    // do action x
}

简单:

bool isDividable = true;
for(int b=1; b<21; b++)
{
     if (i % b != 0)
     {
         isDividable = false;
         break;
     }
}
if(isDividable) do something
bool flag = true;
for(int b=1; b < 21 && (flag &= (i % b == 0)) ; b++)
    ;
if(flag)
   do_action();//do your task

你可以这样写

bool doAction = true;
for(int b=1;b<21;b++)
{
  if (!(i % b == 0))
    {
      doAction = false;
    } 
}
if (doAction)
{
  do action x;
}
当一个条件为 false 时,

这会将布尔值设置为 false,因此它仅在所有条件都为真时执行do action x;

你也可以用 Linq 在更少的行中做到这一点:

var divisors = Enumerable.Range(1, 20);
if(divisors.All(div => i % div == 0))
{
  //do someting
}

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

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

int b;
int max = 20;
for (b = 1; b <= max && i % b == 0; ++b) ;
if (b > max) {
    // do something
}
bool action = true;
for(int b=1;b<21;b++)
{
     if (i % b != 0)
           {
               action = false;
               break;
           } 
}

在此之后:

if (action)
{
// do your action 
}

希望它有帮助.:)