有没有更多的efficient/readable/prettier方式来写这个条件?

Is there a more efficient/readable/prettier way to write this Conditional?

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

一个? B : 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 是一个可为 null 的布尔值

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

如 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  
}  

您可以通过在 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)
    );

这可能满足 "prettier" 和 "more efficient" 因为它避免了重复比较(你的原始与 radioButtonPass 比较了两次);另请注意 ? : 是一个表达式,因此它应该求值为一个值,而不是执行赋值(尽管您可以合法地同时执行这两项操作;赋值的值只是被赋值的值,因此您可以链接赋值例如 A = B = C;AB 都设置为 C 的值)。在你的情况下,你只想将确定的值分配给一个地方,所以它更合适,因为条件在赋值的 RValue 表达式中。

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

int A = 2;
int[] BArr = new int[]{3,2};

var result = BArr.Contains(A);