C# 是否有一种更有效/可读/更美观的方法来编写此条件语句?

C# 是否有一种更有效/可读/更美观的方法来编写此条件语句?,c#,conditional-statements,logical-operators,readability,coding-efficiency,C#,Conditional Statements,Logical Operators,Readability,Coding Efficiency,我正在学习C#中的条件句,我了解它们的基本工作原理 A?B:C 其中A=布尔条件 B=A==真时的结果 C=A==错误时的结果 我的问题更多的是写一个复杂的条件。我试图写: (A==B | A==C)?D:E 我更喜欢这样的条件: A==(B | C)?D:E 但只有当A、B和C是布尔数,我试着比较整数时,这才有效 如果没有一个简单的方法来减少这个,那没关系。我一直在努力使我的代码更高效、更容易阅读 谢谢 var passedRadioGroup = (RadioGrou

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

A?B:C

其中A=布尔条件

B=A==真时的结果

C=A==错误时的结果

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

(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是一个int

radioButtonPass是一个int

radioButtonFail是一个int

PassedBool是一个可为空的bool


本质上,如果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;
} 

正如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中测试第一个,然后在else-if中测试第二个,如果两个都不匹配,则在最后一个else中测试null。(您也可以将其作为带有两个case和一个default的switch语句来执行——但前提是Pass和Fail值是常量,这一点不清楚。)

另一种方法是将两个条件连接到一个表达式中,以模拟if-else:

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

这可能符合“更漂亮”和“更高效”的要求,因为它避免了重复比较(您的原始版本与
radioButtonPass进行了两次比较);还要注意
?:
是一个表达式,因此它应该计算为一个值,而不是执行赋值(虽然您可以合法地同时执行这两个操作;赋值的值只是被赋值的值,因此您可以链接赋值,如
a=B=C;
a
B
都设置为
C
)。在您的例子中,您只想将确定的值分配给一个位置,因此更适合这样,条件位于赋值的右值表达式中。

您可以通过在if中测试第一个值,然后在else if中测试第二个值,如果两个值都不匹配,则最后一个else为null。(您也可以将其作为带有两个case和一个default的switch语句来执行——但前提是Pass和Fail值是常量,这一点不清楚。)

另一种方法是将两个条件连接到一个表达式中,以模拟if-else:

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

这可能符合“更漂亮”和“更高效”的要求,因为它避免了重复比较(您的原始版本与
radioButtonPass进行了两次比较);还要注意
?:
是一个表达式,因此它应该计算为一个值,而不是执行赋值(虽然您可以合法地同时执行这两个操作;赋值的值只是被赋值的值,因此您可以链接赋值,如
a=B=C;
a
B
都设置为
C
)。在您的例子中,您只想将确定的值分配给一个位置,因此更适合这样,条件位于赋值的右值表达式中。

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

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

var result = BArr.Contains(A);

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

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

var result = BArr.Contains(A);

“仅当A、B和C是布尔值时才工作”-“工作”与编译中的一样,但它是一个与您希望它执行的操作截然不同的条件。不,在语言中没有这样的捷径。{B,C}包含一个…我真的不明白为什么你认为你的版本更容易阅读。你能发布你真正的条件语句吗,而不是你不能做你想做的。语言不是那么先进。您必须使用具有两个相等比较的“仅在A、B和C为布尔值时工作”-“工作”与在编译中一样,但它是一个与您希望它执行的非常不同的条件。不,在语言中没有这样的捷径。{B,C}包含一个…我真的不明白为什么你认为你的版本更容易阅读。你能发布你真正的条件语句吗,而不是你不能做你想做的。语言不是那么先进。您必须使用两个相等比较的一个。谢谢!所以,这是一个需要工具,制造工具的情况。谢谢!所以,这是一个需要工具,制造工具的情况。