【问题标题】:Is there a more efficient/readable/prettier way to write this Conditional?有没有更有效/可读/更漂亮的方式来编写这个条件?
【发布时间】:2020-07-31 09:56:34
【问题描述】:

我正在学习 C# 中的条件语句,并且我了解它们的基本工作原理。

一个?乙:丙

其中 A = 布尔条件

B = A == True 时的结果

C = A == False 时的结果

我的问题更多是写一个复杂的条件。我正在尝试写:

(A == B || A == C) ? D : E

我希望条件看起来更像:

A == (B || C) ? D : E

但这仅在 A、B 和 C 是布尔值并且我正在尝试比较整数时才有效。

如果没有一种简单的方法可以减少这种情况,那也没关系。我一直在努力使我的代码更高效、更易于阅读。

谢谢

            var passedRadioGroup = (RadioGroup)sender;
            (passedRadioGroup.CheckedRadioButtonId == Resource.Id.radioButtonPass || passedRadioGroup.CheckedRadioButtonId == Resource.Id.radioButtonFail) ?
                checklistItems[passedRadioGroup.Id].PassedBool = passedRadioGroup.CheckedRadioButtonId == Resource.Id.radioButtonPass :
                checklistItems[passedRadioGroup.Id].PassedBool = null;

CheckedRadioButtonId 是一个整数

radioButtonPass 是一个整数

radioButtonFail 是一个整数

PassedBool 是一个可以为空的布尔值

基本上,如果 CheckedRadioButtonId 等于 radioButtonPass 或 radioButtonFail,我希望将 PassedBool 设置为 true 或 false,否则我希望它为 null。

【问题讨论】:

  • “仅当 A、B 和 C 为布尔值时才有效” - 与编译时一样“有效”,但它的条件与您想要的完全不同。不,语言中没有这样的捷径。
  • {B,C} 包含 A ...
  • 我真的不明白为什么您认为您的版本更易于阅读。
  • 你能不能把你真正的条件语句张贴出来
  • 你不能做你想做的事。语言没那么高级。您将不得不使用两个相等的比较。

标签: c# conditional-statements logical-operators readability coding-efficiency


【解决方案1】:

正如 madreflection 所说,这并不像你想象的那样。

我们来看看
A = 错误
B = 真
C = 错误

对于
(A == B || A == C)? D : E
A 不等于 B 但 A 等于 C 所以结果是 D

对于
A == (B || C) ? D : E
B||C 等于真。 A 不等于真。所以结果是 E。

不,这个逻辑没有内置的快捷方式。

然而,我过去曾在代码中编写过扩展方法,我经常发现自己做了很多 A==X || A==Y || A == Z

public static bool In(this int val, params int[] compareTo){
    for(int i=0;i<compareTo.Length; i++){
        if(compareTo[i] == val)
            return true;
    }
    return false;
} 

然后你可以这样调用

if( A.In(X,Y,Z)){  
//do stuff  
}  

【讨论】:

  • 谢谢!所以这是一个需要一个工具,制造一个工具的情况。
【解决方案2】:

您可以通过在 if 中测试第一个,然后在 else if 中测试第二个,如果两者都不匹配,则使用最终的 else 测试 null。 (您也可以将其作为具有两种情况和一个默认值的 switch 语句来执行——但前提是 Pass 和 Fail 值是常量,这并不清楚。)

您正在寻找的另一种方法是将两个条件链接到一个表达式中以模仿 if-else-if-else:

var passedRadioGroup = (RadioGroup)sender;
checklistItems[passedRadioGroup.Id].PassedBool =
    (passedRadioGroup.CheckedRadioButtonId == Resource.Id.radioButtonPass
        ? true
        : (passedRadioGroup.CheckedRadioButtonId == Resource.Id.radioButtonFail
            ? false : null)
    );

这可能符合“更漂亮”和“更高效”的要求,因为它避免了重复比较(您的原始文件与 radioButtonPass 进行了两次比较);还要注意 ? : 是一个表达式,所以它应该计算一个值,而不是执行一个赋值(虽然你可以合法地做这两个;赋值的值就是被赋值的值,所以你可以像 @ 一样链接赋值987654324@ 将AB 都设置为C 的值)。在您的情况下,您只想将确定的值分配给一个地方,因此在条件位于赋值的 RValue 表达式中的情况下更合适。

【讨论】:

    【解决方案3】:

    有很多方法可以做到这一点。例如,您也可以使用 Linq 进行此操作

    int A = 2;
    int[] BArr = new int[]{3,2};
    
    var result = BArr.Contains(A);
    

    【讨论】:

      猜你喜欢
      • 2019-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-12
      • 1970-01-01
      • 2021-11-18
      相关资源
      最近更新 更多