简化嵌套的IF语句

5

I have a function that is like the following

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 { } - David Starkey
@DavidStarkey 有4种可能的结果状态,但你只返回了3种。 - Scott Chamberlain
然后 if(A && B) { } else if (!A && B) { } else if (B) { } else { } - David Starkey
@DavidStarkey:当然应该写成:if(A && B) { } else if (A) { } else if (B) { } else { } - Pieter Geerkens
@Pieter Geerkens 当然可以 :) 感谢您指出这个问题。 - David Starkey
4个回答

10
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";

2
甚至可以执行 return A ? (B ? "W" : "X") : (B ? "Y": "Z") - SimpleVar
@Yorye 对我来说,这会降低一些可读性,可能有点过头了。 - doppelgreener
2
“更加简洁”的解决方案是我最喜欢的一个。” - Scott Chamberlain
2
当使用“更加简洁”的版本时,我喜欢将冒号从第一行的末尾放在'A'后面的问号下方。在我看来,这是各种放置选项中最好的扫描方式。 - Pieter Geerkens
@PieterGeerkens 请看我的更新问题,我包括了真实版本和我是如何做到的,我已经完全按照您的建议去做了 :) - Scott Chamberlain
@PieterGeerkens +1 我真的很喜欢那个语法。我会编辑我的答案。 - Steven Wexler

3

从逻辑上来说,不可以。您有两个变量的4种不同情况。

但是,您可以让代码更加简洁

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

}

或者如果你感觉比较邪恶,可以将其放在一行中,不使用括号!

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

我正在寻找更好的简洁性,我知道没有逻辑简化。 - Scott Chamberlain
1
这两个选项是我能想到的最丑陋的!你还会穿条纹领带配格子夹克吗?为你敢于发布这两个选项点赞。 - Pieter Geerkens
@PieterGeerkens 公道话说,他是第一个发布三元解决方案的人,steaks后来作为编辑发布了他的。 - Scott Chamberlain

0

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

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

0

我只是为了好玩而加入这个:

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

聪明啊,当我最初尝试考虑更好的方法时,我实际上想到了一个类似的想法,但是使用了一个 switch 语句而不是一个数组 :)。 - Scott Chamberlain

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接