【问题标题】:while loop in C# with multiple conditions具有多个条件的C#中的while循环
【发布时间】: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循环中抛出异常真的有意义吗?一旦抛出一个循环,循环就会终止......

标签: c# .net while-loop conditional-statements


【解决方案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);
           }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-05-03
            • 1970-01-01
            • 2013-08-07
            • 2015-02-14
            • 2013-06-30
            • 2017-03-13
            相关资源
            最近更新 更多