【问题标题】:Simplifing a nested IF statement简化嵌套的 IF 语句
【发布时间】:2013-05-02 22:15:16
【问题描述】:

我有一个类似下面的函数

string Foo(bool A, bool B)
{
    if(A)
    {
        if(B)
        {
            return "W";
        }
        else
        {
            return "X";
        }
    }
    else
    {
        if(B)
        {
            return "Y";
        }
        else
        {
            return "Z";
        }
    }
}

这种双重嵌套对我来说是错误的。有没有更好的方法来实现这种模式?


感谢大家的帮助,我最终选择了三元路线。它帮助扭转了局面:

if (female)
{
    if (nutered)
    {
        destRow["TargetSex"] = "FS";
    }
    else
    {
        destRow["TargetSex"] = "F";
    }
}
else
{
    if (nutered)
    {
        destRow["TargetSex"] = "MN";
    }
    else
    {
        destRow["TargetSex"] = "M";
    }
}

到这里

destRow["TargetSex"] = female ? (nutered ? "FS" : "F")
                              : (nutered ? "MN" : "M");

【问题讨论】:

  • 总有if(A && B) { } else if (B) { } else { }
  • @DavidStarkey 有 4 种可能的结果状态,你只返回 3 个。
  • 然后if(A && B) { } else if (!A && B) { } else if (B) { } else { }
  • @DavidStarkey:当然应该是:if(A && B) { } else if (A) { } else if (B) { } else { }
  • @Pieter Geerkens 当然 :) 感谢您的关注。

标签: c# simplification


【解决方案1】:
if (A)
{
    return B ? "W" : "X";
}
return B ? "Y" : "Z";

或者更简洁:

return A ? (B ? "W" : "X")  
         : (B ? "Y" : "Z");

如果您只使用非嵌套条件:

if (A && B) return "W";
if (A && !B) return "X";
return B ? "Y" : "Z";

【讨论】:

  • 甚至可以做到return A ? (B ? "W" : "X") : (B ? "Y": "Z")
  • @Yorye 这对我(个人)来说失去了一点可读性,并且可能做得过火了。
  • “更简洁”的解决方案是我最喜欢的解决方案。
  • 在使用even more terse 版本时,我喜欢将第一行末尾的冒号放在“A”后面的问号下方。在我看来,它可以扫描各种放置选项中的最佳效果。
  • @PieterGeerkens 看到我更新的问题,我包含了真实版本以及我是如何做到的,我完全按照你的建议做了:)
【解决方案2】:

从逻辑上讲,没有。两个变量有 4 个不同的条件。

您可以使代码更简洁,不过:

string Foo(bool A, bool B)
{
    return A ? 
      B ? "W" : "X"
        :
      B ? "Y" : "Z";

}

或者如果你觉得特别邪恶,把它放在一行没有括号!:

return A?B?"W":"X":B?"Y":"Z";

【讨论】:

  • 我一直在寻找更好的简洁性,我知道没有逻辑简化。
  • 这两个是我能想到的最丑陋的选择!你的格子夹克也系条纹领带吗? +1 勇气发布这两个。
  • @PieterGeerkens 说句公道话,他是第一个发布三元解决方案的人,steaks 稍后将其发布为编辑。
【解决方案3】:

你有四种可能的状态。更短(虽然不一定更容易维护)的表示将是

if (A && B) {
    return "W";
} else if (A && !B) {
    return "X";
} else if (!A && B) {
    return "Y";
else return "Z";

【讨论】:

    【解决方案4】:

    我只是为了好玩才把它扔进去:

        string Foo(bool A, bool B)
        {
            var labels = new[]{"W", "X", "Y", "Z"};
            return labels[(A ? 0 : 2) + (B ? 0 : 1)];
        }
    

    【讨论】:

    • 聪明,当我最初试图想出更好的方法时,我实际上想到了一个类似的想法,但使用 switch 语句而不是数组:)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-05
    • 1970-01-01
    • 1970-01-01
    • 2014-07-12
    • 1970-01-01
    相关资源
    最近更新 更多