我怎么摆脱这个goto?

时间:2016-01-06 00:44:53

标签: c# foreach refactoring goto

我刚刚开始了一个职位,在工作日结束时,我通过慢慢阅读我们的代码库来等待流量。我偶然发现这一点,即使在白板上花了相当多的时间,我仍然想不出提取setPristine()的方法。有没有办法消除这种跳跃?

goto

5 个答案:

答案 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,则需要breakreturn。但是如果没有breakreturngoto,则可以使用以下选项:

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;
            }
        }
    }
}