我刚刚开始了一个职位,在工作日结束时,我通过慢慢阅读我们的代码库来等待流量。我偶然发现这一点,即使在白板上花了相当多的时间,我仍然想不出提取setPristine()
的方法。有没有办法消除这种跳跃?
goto
答案 0 :(得分:6)
由于标签exitLoops
位于方法的末尾,因此您可以使用return
退出方法,如下所示:
if (dataRX != null && dataRX.ID.Equals(globalNonsense.ID))
{
// Update Data with the latest changes
dataRX.fooBuddy = foo;
return;
}
另一种方法是使用这样的标志:
bool done = false;
foreach (Thing bar in something)
{
foreach (Collection item in bar.Stuff)
{
Data dataRX = item.First;
if (dataRX != null && dataRX.ID.Equals(globalNonsense.ID))
{
// Update Data with the latest changes
dataRX.fooBuddy = foo;
done = true;
break;
}
}
if(done)
break;
}
即使标签后面有一些代码,您也可以使用第二种方法。
答案 1 :(得分:3)
将内循环移动到方法,并根据其返回值有条件地中断。
答案 2 :(得分:2)
它不太好,但没有实现一个完整的新算法,这似乎是最简单的方法:
foreach (Thing bar in something)
{
bool exitLoop = false;
foreach (Collection item in bar.Stuff)
{
Data dataRX = item.First;
if (dataRX != null && dataRX.ID.Equals(globalNonsense.ID))
{
// Update Data with the latest changes
dataRX.fooBuddy = foo;
exitLoop = true;
break;
}
}
if (exitLoop) break;
}
答案 3 :(得分:1)
或者,您可以使用LINQ执行此操作:
public void MyUpdate(MyType foo)
{
Thing dummy = something.FirstOrDefault(bar => bar.Stuff.SkipWhile((item) =>
{
Data dataRx = item.First;
if (dataRx != null && dataRx.ID.Equals(globalNonsense.ID))
{
dataRx.fooBuddy = foo;
return false;
}
else
{
return true;
}
}).Count() != 0);
}
答案 4 :(得分:0)
如果使用foreach
,则需要break
或return
。但是如果没有break
,return
或goto
,则可以使用以下选项:
public void MyUpdate(MyType foo)
{
bool stop = false;
/*Prep code for the loops*/
for (var i = 0; !stop && (i < something.Count); i++)
{
for (var j = 0; !stop && (j < something[i].Stuff.Count); j++)
{
Data dataRX = something[i].Stuff[j].First;
if (dataRX != null && dataRX.ID.Equals(globalNonsense.ID))
{
// Update Data with the latest changes
dataRX.fooBuddy = foo;
stop = true;
}
}
}
}