【问题标题】:How do you return true for a boolean return type if you have a for block to execute如果你有一个 for 块要执行,你如何为布尔返回类型返回 true
【发布时间】:2018-04-16 05:56:35
【问题描述】:

所以我正在阅读这个问题return True stop the loop in Python?,但它在 python 中,而我在 c# 中

无论如何我有一个看起来像这样的方法

public bool HasRequirements(string upgradeName){
        for (int i = 0; i < upgradeRequirements [upgradeName].Length; i++) {
            if (upgradesPurchased [upgradeRequirements [upgradeName] [i]]) {
                return true;
            } else {
                return false;
            }
        }
        return false;
    }

在编写代码时,我认为返回 true 会停止 for 块的执行,所以我开始思考当你有一个 for 块要执行时,如何为 boolean 返回类型返回 true?

【问题讨论】:

  • 肯定会停止执行 return 语句的灵魂目的是提供输出,因此它将停止整个执行。你想在for循环中做什么你能提供一些描述吗?
  • @Paras 查看 ded 答案的评论

标签: c# unity3d


【解决方案1】:

根据您的 cmets,另一个扩展函数仅在所有迭代都为真时才返回真:

        public bool HasRequirements(string upgradeName){
            for (int i = 0; i < upgradeRequirements [upgradeName].Length; i++) {
                if (upgradesPurchased [upgradeRequirements [upgradeName] [i]]) {
                    // we skip return true
                    continue;
                } else {
                    // false condition, immed return false
                    return false;
                }
            }
            // we did not met false - so we can return true
            return true;
        }

如果您想获得“多个结果” - 另一种可能性是使用yield 语句。您可以在此处找到详细描述它的 so 帖子:What is the yield keyword used for in C#?

使用 yield 会继续根据以下枚举返回值。之后可以检查返回值是否为真:

        public IEnumerable<bool> HasRequirements(string upgradeName)
        {
            bool returnValue = false;
            for (int i = 0; i < upgradeRequirements[upgradeName].Length; i++)
            {
                if (upgradesPurchased[upgradeRequirements[upgradeName][i]])
                {
                    yield return true;
                }
                else
                {
                    yield return false;
                }
            }
            yield return returnValue;
        }

【讨论】:

  • 如果同样的i = 0返回true,然后i = 1返回false,然后i = 2返回true,那么boolean会在它应该返回false时返回true
  • 它不会停止执行,它会继续执行。所以是的,returnValue 总是会更改为最新的评估表达式。如果要返回第一个找到的表达式值,则应直接返回将停止执行的值。但是如果你已经确定了返回值,为什么还要继续执行呢?
  • 所以就像我有一个包含所需组件的升级,并且在我能够购买之前必须购买所有 3 个组件,所以如果一个组件尚未购买,那么它应该返回 false 否则如果所有组件被购买然后它应该返回 true
  • 更新了我的帖子:)
【解决方案2】:

"如果一个组件没有被购买,那么它应该返回false,否则如果所有组件都被购买,那么它应该返回true"

也许您需要考虑从原来的方向恢复:

public bool HasRequirements(string upgradeName)
{
    for (int i = 0; i < upgradeRequirements [upgradeName].Length; i++) 
    {
        if (upgradesPurchased [upgradeRequirements [upgradeName] [i]]) 
        {
            continue; 
        } else {
            return false;  // if one component has not been bought
        }
    }
    return true; // all components were bought
}

现在如果当前正在检查的购买已经完成,那么继续下一个,基本上忽略它并继续前进。但是,如果没有完成,则认为当前状态错误就足够了,因此返回 false 并丢弃所有检查,因为它最终将是错误的。

【讨论】:

  • 答案太简单了不敢相信我没有明白
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-16
  • 2018-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-17
相关资源
最近更新 更多