while循环在C#中有多个条件

时间:2013-09-24 08:55:48

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

这是我的代码:

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),它不起作用。有什么想法可以解决这个问题吗?

5 个答案:

答案 0 :(得分:8)

您只需要添加一些括号:

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

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

string line;

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

答案 1 :(得分:6)

尝试在循环外声明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);
 }

答案 2 :(得分:2)

试试这个:

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!=进行比较。

答案 3 :(得分:1)

尝试

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

答案 4 :(得分:0)

您可以使用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;            
}

这是一个带一个循环的循环(如果忽略抛出;)),所以它是一个结构化循环。

你也可以使用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;     
}