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
}