gpt4 book ai didi

c# - 在嵌套的 while 循环中继续

转载 作者:IT王子 更新时间:2023-10-29 03:49:09 27 4
gpt4 key购买 nike

在此代码示例中,是否有任何方法可以从 catch block 继续外循环?

while
{
// outer loop

while
{
// inner loop
try
{
throw;
}
catch
{
// how do I continue on the outer loop from here?
continue;
}
}
}

最佳答案

更新:这个问题是 my article on this subject. 的灵感来源感谢您提出很好的问题!


"continue"和 "break"只不过是 "goto"的令人愉快的语法。显然,通过给它们起可爱的名字并将它们的用法限制在特定的控制结构中,它们不再引起“所有 goto 总是不好的”人群的愤怒。

如果您想做的是继续到外部,您可以简单地在外部循环的顶部定义一个标签,然后“转到”该标签。如果您觉得这样做不会影响代码的可理解性,那么这可能是最权宜之计。

但是,我会借此机会考虑您的控制流是否会从某些重构中获益。每当我在嵌套循环中有条件“中断”和“继续”时,我都会考虑重构。

考虑:

successfulCandidate = null;
foreach(var candidate in candidates)
{
foreach(var criterion in criteria)
{
if (!candidate.Meets(criterion))
{ // TODO: no point in continuing checking criteria.
// TODO: Somehow "continue" outer loop to check next candidate
}
}
successfulCandidate = candidate;
break;
}
if (successfulCandidate != null) // do something

两种重构技术:

首先,将内部循环提取到一个方法中:

foreach(var candidate in candidates)
{
if (MeetsCriteria(candidate, criteria))
{
successfulCandidate = candidate;
break;
}
}

其次,能否消除所有的循环?如果您正在循环是因为您正在尝试搜索某些内容,请将其重构为一个查询。

var results = from candidate in candidates 
where criteria.All(criterion=>candidate.Meets(criterion))
select candidate;
var successfulCandidate = results.FirstOrDefault();
if (successfulCandidate != null)
{
do something with the candidate
}

如果没有循环,则无需中断或继续!

关于c# - 在嵌套的 while 循环中继续,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1133408/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com