在 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 语句中添加附加条件的主要内容,如果未能解决你的问题,请参考以下文章

Java中,switch()括号中的参数是

switch case 语句中的分号

C语言switch case后如何执行多条命令

C语言中的Switch-case语句

关于switch case语句的问题

SWITCH语句中如果执行了一条CASE语句是空的后如果没有BREAK会不会执行DEFAULT语句(其他CASE也没BREAK)