具有多个条件的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循环的主要内容,如果未能解决你的问题,请参考以下文章