在 Switch 中的 Case 语句中添加附加条件
Posted
技术标签:
【中文标题】在 Switch 中的 Case 语句中添加附加条件【英文标题】:Add a additional condition to Case Statement in Switch 【发布时间】:2013-01-10 06:49:26 【问题描述】:是否可以在 C# 中为 Switch 语句添加额外的条件,如下所示
switch(MyEnum)
case 1:
case 2:
case 3 && Year > 2012://Additional Condtion Here
//Do Something here..........
break;
case 4:
case 5:
//Do Something here..........
break;
在上面提到的例子中,如果 MyEnum = 3 那么它必须在 Year > 2012 时被执行...有可能吗?
[编辑]
年份 > 2012 不适用于案例 1 和案例 2。
【问题讨论】:
【参考方案1】:C#7 新特性:
案例...何时
https://docs.microsoft.com/hu-hu/dotnet/articles/csharp/whats-new/csharp-7
public static int DiceSum4(IEnumerable<object> values)
var sum = 0;
foreach (var item in values)
switch (item)
case 0:
break;
case int val:
sum += val;
break;
case IEnumerable<object> subList when subList.Any():
sum += DiceSum4(subList);
break;
case IEnumerable<object> subList:
break;
case null:
break;
default:
throw new InvalidOperationException("unknown item type");
return sum;
【讨论】:
【参考方案2】:为了使其按照您使用 1 和 2 的失败逻辑指示的方式工作,我建议将 //do something here
部分移出方法或函数,然后执行以下操作:
case 1:
case 2:
DoSomething();
break;
case 3:
if(Year > 2012) DoSomething();
break;
另一种选择是:
case 1:
case 2:
case 3:
if (MyEnum != 3 || Year > 2012)
// Do something here
break;
但我认为第一个选项更直观和可读。
【讨论】:
SWITCH..CASE 里面有 IF 语句是个坏主意,因为两者都是选择控制语句,我们不要混用。【参考方案3】:答案是否定的。
您需要以下物品:
switch (MyEnum)
case 1:
case 2:
DoSomething();
break;
case 3:
if (Year > 2012) DoSomething();
break;
【讨论】:
【参考方案4】:您不能为案例添加条件。 Case 子句必须是编译时间常数。相反,您可以在 case 语句中使用 if 语句。
case 3:
if( > 2012)
//Do Something here..........
break;
【讨论】:
在这种情况下,对于案例 1,2 和案例 3,代码可能是重复的。 @Anandkumar 如果 >2012 条件适用于许多或所有 case 语句,您可以将 swich 包装在if
@Anandkumar,不,它会首先比较 MyEnum,如果它是 3,那么它将跳转到 case 语句 3,在那里它将检查年份。如果您必须检查所有情况下的年份,请在开关上使用 if 语句
@Habib 他的意思是,按照你的方式,当 MyEnum 为 1、2 或 3 时会发生 >2012 检查,但他只希望在 MyEnum 为 3 时进行 > 2012 限制。
【参考方案5】:
你必须在你的 case 中使用 if 条件,你不能在 case 语句中使用 &&,使用如下:
switch(MyEnum)
case 1:
case 2:
case 3: //Additional Condtion Here
if (Year > 2012)
//Do Something here..........
break;
case 4:
case 5:
//Do Something here..........
break;
【讨论】:
他希望 Year > 2012 仅适用于案例:3。 在你的情况下 if (Year > 2012) //Do Something here.......... 适用于所有三个 casee case 1: case 2: case 3: 【参考方案6】:或者,您可以将条件添加到开关:
switch (MyEnum!=3 || Year>2012 ? MyEnum : -1)
case 1:
case 2:
case 3:
//Do Something here..........
break;
case 4:
case 5:
//Do Something here..........
break;
【讨论】:
【参考方案7】:大多数时候,我都会做类似的事情......
(对不起命名,用例没有启发我)
考虑那些私有类:
private class NumberState
public static NumberState GetState(int number, int year)
if (number == 1)
return new FirstNumberState();
if (number == 2)
return new FirstNumberState();
if (number == 3 && year > 2012)
return new FirstNumberState();
if (number == 4)
return new SecondNumberState();
if (number == 5)
return new SecondNumberState();
return new DefaultNumberState();
private class FirstNumberState : NumberState
private class SecondNumberState : NumberState
private class DefaultNumberState : NumberState
那么你可以这样做:
switch (NumberState.GetState(MyEnum, Year))
case FirstNumberState _:
// do something
break;
case SecondNumberState _:
// do something
break;
case DefaultNumberState _:
default:
throw new Exception("Unhandled number state");
即使您的情况变得更复杂,也很容易阅读。
【讨论】:
【参考方案8】:您可以使用 C# 8 功能
public static bool SomeHelper(int value)
=> value switch
100 => true,
var x when x >= 200 && x <= 300 => true,
_ => false, // All other values
;
true
的值为 100、200...300,false
的值为其他值
你也可以使用参数:
public static bool SomeHelper(int value, bool param)
=> value switch
100 => true,
var x when x >= 200 && x <= 300 && param => true,
_ => false, // All other values
;
在这种情况下,只有当 value
为 100 且 param
为 false 时,您才会拥有 true
【讨论】:
以上是关于在 Switch 中的 Case 语句中添加附加条件的主要内容,如果未能解决你的问题,请参考以下文章
SWITCH语句中如果执行了一条CASE语句是空的后如果没有BREAK会不会执行DEFAULT语句(其他CASE也没BREAK)