【问题标题】:Add a additional condition to Case Statement in Switch在 Switch 中的 Case 语句中添加附加条件
【发布时间】: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。

【问题讨论】:

    标签: c# switch-statement


    【解决方案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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-09-06
              • 2013-09-24
              • 1970-01-01
              • 2020-03-15
              相关资源
              最近更新 更多