是否有办法在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
}
}
答案 0 :(得分:94)
你也可以使用像这样的简单LINQ查询:
if (Enumerable.Range(1, 20).All(b => i % b == 0))
DoAction();
答案 1 :(得分:88)
有经典的解决方案:
var flag = true
首先我们假设满足所有条件(循环):if (i % b != 0)
。
如果不满足至少一个条件:break;
,我们停止循环过程:flag = false
因为无需继续检查,并设置flag
,现在通过SomeAction()
变量我们知道检查的结果,以后可以使用它来确定我们是否应该调用{{1}}。
答案 2 :(得分:37)
如何:
if (i % 232792560 == 0) {
// do action
}
如果您想检查您的号码是否可以被大量数字整除,那相当于检查您的号码是否可以被所有这些号码的最小公倍数整除。在这种情况下,那2 4 * 3 2 * 5 * 7 * 11 * 13 * 17 * 19.
答案 3 :(得分:25)
所以你想链接一些非常相似的布尔表达式,而不是明确地写出它们。
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;
}
顺便说一句:LINQ命名空间提供了许多辅助方法,可以让您更简洁,更清晰地编写代码:
using System.Linq;
// ...
if (Enumerable.Range(1, 20).All(n => n % i == 0))
{
// do action x
}
答案 4 :(得分:11)
易:
bool isDividable = true;
for(int b=1; b<21; b++)
{
if (i % b != 0)
{
isDividable = false;
break;
}
}
if(isDividable) do something
答案 5 :(得分:5)
bool flag = true;
for(int b=1; b < 21 && (flag &= (i % b == 0)) ; b++)
;
if(flag)
do_action();//do your task
答案 6 :(得分:3)
if (action)
{
// do your action
}
之后:
var flag = true;
for(int b = 2; b < 21; b++)
{
if (i % b != 0)
{
flag = false;
break;
}
}
if(flag)
SomeAction():
希望它有所帮助。:)
答案 7 :(得分:3)
你可以像这样写
pyplot
当一个条件为假时,将bool设置为false,因此只有在所有条件都为真时才执行bool doAction = true;
for(int b=1;b<21;b++)
{
if (!(i % b == 0))
{
doAction = false;
}
}
if (doAction)
{
do action x;
}
。
您也可以使用Linq在更少的行中执行此操作:
do action x;
说明:Enumerable.Range返回值为1到20的Array,.All检查每个对象的Lambda表达式。
答案 8 :(得分:3)
这里有很多类似的答案,使用旗帜。一个更简单的解决方案是使用循环变量(问题中的b
)作为测试条件:
int b;
int max = 20;
for (b = 1; b <= max && i % b == 0; ++b) ;
if (b > max) {
// do something
}