有没有更多的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;
将 A
和 B
都设置为 C
的值)。在你的情况下,你只想将确定的值分配给一个地方,所以它更合适,因为条件在赋值的 RValue 表达式中。
有很多方法可以做到这一点。例如,您也可以使用 Linq
int A = 2;
int[] BArr = new int[]{3,2};
var result = BArr.Contains(A);
我正在学习 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;
将 A
和 B
都设置为 C
的值)。在你的情况下,你只想将确定的值分配给一个地方,所以它更合适,因为条件在赋值的 RValue 表达式中。
有很多方法可以做到这一点。例如,您也可以使用 Linq
int A = 2;
int[] BArr = new int[]{3,2};
var result = BArr.Contains(A);