带有 2 个动作的单行 if 语句

Posted

技术标签:

【中文标题】带有 2 个动作的单行 if 语句【英文标题】:Single line if statement with 2 actions 【发布时间】:2012-09-11 03:18:06 【问题描述】:

我想做一个包含多个操作的单行 if 语句。

默认是这样的:

(if) ? then : else

userType = (user.Type == 0) ? "Admin" : "User";

但我不仅需要一个“else”,我还需要一个“else if”

多行这样:

if (user.Type == 0)
    userType = "Admin" 
else if (user.Type == 1)
    userType = "User"
else if (user.Type == 2)
    userType = "Employee"

单行有可能吗?

【问题讨论】:

我认为这可能是enum 更好的情况,如果您的某些 API 使用整数,而其他 API 使用字符串,如果您忘记更新每个耦合的含义,则可能会出现更新异常。 【参考方案1】:

听起来你真的想要一个Dictionary<int, string> 或者可能是一个switch 声明......

可以使用条件运算符来做到这一点:

userType = user.Type == 0 ? "Admin"
         : user.Type == 1 ? "User"
         : user.Type == 2 ? "Employee"
         : "The default you didn't specify";

虽然您可以将其放在一行中,但我强烈建议您不要这样做。

我通常在不同的条件下这样做 - 不仅仅是几个不同的可能值,这在地图中处理得更好。

【讨论】:

乔恩,我认为这有点过分了……为什么要进一步复杂化呢? (顺便说一句,我很高兴看到你提出和我一样的问题:) @H2CO3:你说哪个版本更复杂?我们想将一个整数映射到一个字符串——字典对我来说似乎是最自然的方法。 我的意思是字典。我觉得吸引您的是“良好做法”。当然,您可以使用字典 - 但是,您可以使用数组,索引是用户的类型(实际上应该是连续整数,可能是枚举),并且对于 3 个糟糕的简单整数,三元运算符不是那么不好!就个人而言,我不觉得它根本不可读。 switch 语句显然更好(从我的角度来看),如果您认为?: 不可读,我宁愿建议使用switch 非常感谢,和H2CO3的答案基本一样,只是格式更好 @user1676094:是的,如果值真的自然地从 0 开始并且是连续的,那么数组就可以了。我不喜欢在这里使用条件运算符的原因是它使重复使用user.Type 看起来很巧合——而实际上我们是在说,“我们有一个值——那个值是什么意思?”我们确实在尝试将整数值映射到字符串——那么为什么不使用它呢?当条件运算符表示单独的条件时,我可以使用它,但这种情况对我来说并不是那样。【参考方案2】:
userType = (user.Type == 0) ? "Admin" : (user.type == 1) ? "User" : "Admin";

应该可以解决问题。

【讨论】:

【参考方案3】:

可以将其写在单行中,但这不是某人能够阅读的内容。保持它就像你已经写的那样,它本身就已经很漂亮了。

如果您有太多 if/else 构造,您可以考虑使用不同的数据结构,例如 Dictionaries(查找键)或 Collection(对其运行条件 LINQ 查询)

【讨论】:

以上是关于带有 2 个动作的单行 if 语句的主要内容,如果未能解决你的问题,请参考以下文章

为两个条件构造一个 if 语句的最佳方法是啥,每个条件都有一个动作,并且两者都有一个动作?

反应条件动作 - useEffect vs if 语句

JS之 if语句函数 对接事件动作 函数更改css css对接需要换妆的区id或class

如何创建 If 语句以检查数组中的某些对象。 Flash CS5 动作脚本 3

zend 框架显示/处理表单使用相同的动作/视图?

Grails beforeInterceptor 有 2 个动作