返回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#。
您实现的代码说"如果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;
}
}