具有多个条件的C#中的while循环

Posted

技术标签:

【中文标题】具有多个条件的C#中的while循环【英文标题】:while loop in C# with multiple conditions 【发布时间】:2013-09-29 09:33:40 【问题描述】:

这是我的代码:

while( Func(x) != ERR_D)

   if(result == ERR_A) 
         throw...; 
   if(result == ERR_B)
         throw...;

  mydata.x = x;
 

问题是我想在 while 条件中使用result = Func(x),因为结果将在 while 循环内检查。 while 循环应该调用Func(x),直到它返回ERR_D。 我不能用

do 
    result = Func(x);
   if(result == ERR_A) 
         throw ...; 
   if(result == ERR_B)
         throw ...;
    mydata.x = x;
   while(result != ERR_D); 

在我的项目中,它首先调用Func(x),这是我不想要的。 但是我试过while(result = Func(x) != ERR_D),还是不行。有什么想法可以解决这个问题吗?

【问题讨论】:

好吧,x 永远不会改变。也许这与它有关?很难说,因为“不起作用”可能意味着几乎任何事情,我们不知道应该发生什么。 var result = Func(x); while (result != ERR_D) doStuff(); result = Func(x); ? 在while循环中抛出异常真的有意义吗?一旦抛出一个循环,循环就会终止...... 【参考方案1】:

您可以使用while (true)... 来表达这一点:

while (true)

    var result = Func(x);

    if (result == ERR_D)
        break;

    if (result == ERR_A) 
        throw ...; 

    if (result == ERR_B)
        throw ...;

    mydata.x = x;            

这是一个单退出循环(如果你忽略了 throws ;)),所以它是一个结构化循环。

您也可以使用for 循环,尽管它看起来有点古怪(双关语不是故意的!):

for (var result = Func(x); result != ERR_D; result = Func(x))

    if (result == ERR_A) 
        throw ...; 

    if (result == ERR_B)
        throw ...;

    mydata.x = x;     

【讨论】:

【参考方案2】:

你只需要添加一些括号:

while((result = Func(x)) != ERR_D)  /* ... */ 

!= 运算符的优先级高于赋值,因此您需要强制编译器先执行赋值(在 C# 中计算为赋值),然后再比较 @987654323 两侧的值@ 运算符彼此。这是您经常看到的模式,例如读取文件:

string line;

while ((line = streamReader.ReadLine()) != null)  /* ... */ 

【讨论】:

【参考方案3】:

试试这个:

while((result=Func(x)) != ERR_D)
 if(result == ERR_A) 
      throw...; 
 if(result == ERR_B)
      throw...;
 mydata.x = x;

注意:赋值首先在括号(result=Func(x))中完成,这个赋值实际上是由运算符=的重载完成的,这个运算符返回对左侧操作数的引用,即result。之后,result 将通过运算符!=ERR_D 进行比较。

【讨论】:

【参考方案4】:

试试

while((result = Func(x)) != ERR_D)

【讨论】:

【参考方案5】:

尝试在循环外声明result,然后在每次迭代时为其分配Funcs返回值。

例如:

var result = Func(x);

while(result != ERR_D)

   if(result == ERR_A) 
         throw...; 
   if(result == ERR_B)
         throw...;

  mydata.x = x;
  result = Func(x);
 

【讨论】:

以上是关于具有多个条件的C#中的while循环的主要内容,如果未能解决你的问题,请参考以下文章

如何修复具有多个返回错误的条件的while循环

17 C#中的循环执行 while循环

Bash脚本,while循环中的多个条件

c#中的for和while循环

C#中至少包含六个单词的字符串的while循环

While 循环计时如何在带有多个线程的 C# 中工作?