返回true后停止迭代?

时间:2012-01-25 15:55:33

标签: c# iteration

(想不出更好的标题,随意将其编辑成更能描述问题的标题)

我有以下方法:

bool CalculateNewState(int adjacent, bool currentState)
    {
        if (currentState == true)
        {
            foreach (int n in liveRule)
            {
                if (adjacent == n)
                {
                    return true;
                }               
            }
            return false;
        }
        else
        {
            foreach (int n in becomeAliveRule)
            {
                if (adjacent == n)
                {
                    return true;
                }               
            }
            return false;
        }
    }

这是针对game of life克隆的。我想要实现的是用户可以制定自己的规则。

bool currentState告诉方法细胞是否存活。 int adjacent告诉方法该单元有多少个活着的邻居。

我想要实现的是当用户说: 2,3 and 5 neighbors keep the cell alive。它会遍历一个包含liveRule的数组(2,3 and 5)。如果发生任何匹配,则应返回true,否则返回false

这里发生的是,在返回true之后,它会继续迭代并最终返回liveRule中的最后一个元素是否匹配。

我需要做什么,在匹配发生后停止迭代?

我当然可能采取错误的方法解决这个问题。我从建议here开始。

(试图尽我所能描述它,但似乎还不太清楚)

这是Unity3D中的C#。

5 个答案:

答案 0 :(得分:6)

您实施的代码说“如果相邻不等于2,3或5中的任何一个,则返回”。显然邻近不能等于所有

重新开始。重命名您的方法,使它们更清晰。布尔应该回答一个真/假的问题,所以选择提出问题的名字:

bool IsCellAlive(int adjacentCount, bool isAlive)
{
    if (isAlive)
        return liveRule.Contains(adjacentCount);
    else
        return deadRule.Contains(adjacentCount);
}

“Contains”比foreach循环慢,因此可能会导致性能问题。现在不要担心;你还没有得到代码正确。编写代码,使其明显正确,然后使用分析器找到慢点,如果它不够快。

记住:让它正确,然后说清楚,然后快速。

答案 1 :(得分:1)

您的return语句会立即退出CalculateNewState方法。如果您发现迭代仍在继续,则要么您没有点击return语句(adjacent == n永远不会出现),或者可能会从代码中的其他位置重复调用CalculateNewState。 / p>

您可以更简单地将其重写为:

if (currentState)
    return liveRule.Contains(adjacent);
return becomeAliveRule.Contains(adjacent);

答案 2 :(得分:1)

你可以随时使用“break”语句来终止循环。做类似的事情:

bool CalculateNewState(int adjacent, bool currentState)
{
    if(currentState)
    {
        return IsStateMatch(adjacent, liveRule);
    }
    else
    {
        return IsStateMatch(adjacent, becomeAliveRule);
    }
}

bool IsStateMatch(int adjacent, int[] rules)
{
    bool finalState = false;

    if(rules != null)
    {
        for(int i = 0; i < rules.length; i++)
        {
            if(adjacent == rules[i])
            {
                finalState = true;
                break;
            }
        }
    }

    return finalState;
}

为了便于阅读,我把方法分解了一点,但我认为这是基本的想法。现在,我同意其他海报关于可能发生的事情。如果你的循环在中断/返回语句之后继续,那么你很可能在其他地方错误地调用该方法的错误代码。

答案 3 :(得分:0)

看起来你的平等测试是罪魁祸首......你不应该测试adjacent == n而不是adjacent != n吗?这样,它将为匹配返回true,如果不匹配则仅返回false。

返回退出循环后,迭代器不会继续。

答案 4 :(得分:0)

你可以使用for循环代替foreach和其他变量吗?

bool CalculateNewState(int adjacent, bool currentState)
{
    if (currentState == true)
    {
        bool match = false;
        for(int n = 0; n < liveRule.length && !match; n++)
        {
            if (adjacent != n)
            {
                match = true;
            }               
        }
        return match;
    }
    else
    {
        bool match = false;
        for(int n = 0; n < becomeAliveRule.length && !match; n++)
        {
            if (adjacent != n)
            {
                match = true;
            }               
        }
        return match;
    }
}