返回true后停止迭代

本文关键字:迭代 true 返回 | 更新日期: 2023-09-27 18:21:28

(想不出更好的标题了,可以随意编辑为更好地描述问题的标题)

我有以下方法:

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

这是一个生命克隆游戏。我想要实现的是用户可以制定自己的规则。

bool currentState告诉该方法该小区是否是活的。CCD_ 2告诉该方法该小区具有多少个活着的邻居。

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

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

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

当然,我可能对这个问题采取了错误的做法。我从这里的建议开始。

(试图尽我所能描述它,但似乎仍然很不清楚)

这是Unity3D中的C#。

返回true后停止迭代

您实现的代码说"如果neighbor不等于2、3或5中的任何一个,那么返回"。显然,相邻不能等于所有

重新开始。重命名方法,使其更加清晰。布尔型应该回答正确/错误的问题,所以选择提出问题的名称:

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

"Contains"比foreach循环慢,因此这可能会导致性能问题。现在不要担心;您甚至还没有得到正确的代码。编写代码,使其明显正确,如果速度不够快,则使用探查器查找慢点。

记住:先让它正确,再让它清晰,再让其快速。

您的return语句将立即退出CalculateNewState方法。如果您发现迭代仍在继续,则可能是您没有命中return语句(adjacent == n从来都不是真的),或者可能是CalculateNewState从代码中的其他地方被重复调用。

您可能可以更简单地将其重写为以下内容:

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

您可以始终使用"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;
}

为了可读性,我对这些方法进行了更多的分解,但我认为这是基本的想法。现在,我确实同意其他海报关于可能发生的事情。如果您的循环在break/return语句之后仍在继续,那么您很可能在其他地方错误地调用了该方法。

看起来您的平等测试是罪魁祸首。。。你不应该测试adjacent == n而不是adjacent != n吗?这样,它将为匹配返回true,只有在没有匹配的情况下才返回false。

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

是否可以使用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;
    }
}