是否有一种方法可以通过多个case语句而不声明case值:重复?

我知道这很管用:

switch (value)
{
   case 1:
   case 2:
   case 3:
      // Do some stuff
      break;
   case 4:
   case 5:
   case 6:
      // Do some different stuff
      break;
   default:
       // Default stuff
      break;
}

但我想这样做:

switch (value)
{
   case 1,2,3:
      // Do something
      break;
   case 4,5,6:
      // Do something
      break;
   default:
      // Do the Default
      break;
}

这是我从另一种语言中想到的语法,还是我遗漏了什么?


当前回答

下面的代码将无法工作:

case 1 | 3 | 5:
// Not working do something

做到这一点的唯一方法是:

case 1: case 2: case 3:
// Do something
break;

您正在寻找的代码在Visual Basic中工作,您可以轻松地将范围…在switch语句的none选项中,或者如果else blocks方便,我建议,在非常极端的情况下,用Visual Basic生成.dll,然后导入回c#项目中。

注意:在Visual Basic中等效的开关是“选择大小写”。

其他回答

我想这个问题已经有答案了。然而,我认为你仍然可以通过以下方式在语法上更好地混合这两个选项:

switch (value)
{
    case 1: case 2: case 3:          
        // Do Something
        break;
    case 4: case 5: case 6: 
        // Do Something
        break;
    default:
        // Do Something
        break;
}

只是为了增加对话,使用. net 4.6.2我还能够做以下工作。 我测试了代码,它确实为我工作。

你也可以做多个“或”语句,如下所示:

            switch (value)
            {
                case string a when a.Contains("text1"):
                    // Do Something
                    break;
                case string b when b.Contains("text3") || b.Contains("text4") || b.Contains("text5"):
                    // Do Something else
                    break;
                default:
                    // Or do this by default
                    break;
            }

你也可以检查它是否与数组中的值匹配:

            string[] statuses = { "text3", "text4", "text5"};

            switch (value)
            {
                case string a when a.Contains("text1"):
                    // Do Something
                    break;
                case string b when statuses.Contains(value):                        
                    // Do Something else
                    break;
                default:
                    // Or do this by default
                    break;
            }

实际上我也不喜欢GOTO命令,但它在微软官方材料中,这里是所有允许的语法。

如果可以到达开关段的语句列表的结束点,则会发生编译时错误。这就是所谓的“不失败”规则。这个例子

switch (i) {
case 0:
   CaseZero();
   break;
case 1:
   CaseOne();
   break;
default:
   CaseOthers();
   break;
}

有效,因为没有可达的端点。与C和c++不同,一个切换段的执行不允许“通过”到下一个切换段,以及示例

switch (i) {
case 0:
   CaseZero();
case 1:
   CaseZeroOrOne();
default:
   CaseAny();
}

导致编译时错误。当执行一个switch段后,必须执行另一个switch段,必须使用显式的goto case或goto default语句:

switch (i) {
case 0:
   CaseZero();
   goto case 1;
case 1:
   CaseZeroOrOne();
   goto default;
default:
   CaseAny();
   break;
}

在一个开关区段中允许有多个标签。这个例子

switch (i) {
case 0:
   CaseZero();
   break;
case 1:
   CaseOne();
   break;
case 2:
default:
   CaseTwo();
   break;
}

我相信在这种特殊情况下,可以使用GOTO,这实际上是唯一失败的方法。

另一种选择是使用例行程序。如果案例1-3都执行相同的逻辑,那么将该逻辑包装在一个例程中,并为每个案例调用它。我知道这实际上并没有摆脱case语句,但它确实实现了良好的风格,并将维护保持在最低限度.....

[编辑]增加了匹配原始问题的替代实现…[/编辑]

switch (x)
{
   case 1:
      DoSomething();
      break;
   case 2:
      DoSomething();
      break;
   case 3:
      DoSomething();
      break;
   ...
}

private void DoSomething()
{
   ...
}

Alt

switch (x)
{
   case 1:
   case 2:
   case 3:
      DoSomething();
      break;
   ...
}

private void DoSomething()
{
   ...
}

如果你有非常大量的字符串(或任何其他类型)的情况下都做同样的事情,我建议使用字符串列表结合字符串。包含属性。

如果你有一个大的switch语句

switch (stringValue)
{
    case "cat":
    case "dog":
    case "string3":
    ...
    case "+1000 more string": // Too many string to write a case for all!
        // Do something;
    case "a lonely case"
        // Do something else;
    .
    .
    .
}

你可能想用这样的if语句替换它:

// Define all the similar "case" string in a List
List<string> listString = new List<string>(){ "cat", "dog", "string3", "+1000 more string"};
// Use string.Contains to find what you are looking for
if (listString.Contains(stringValue))
{
    // Do something;
}
else
{
    // Then go back to a switch statement inside the else for the remaining cases if you really need to
}

这适用于任意数量的字符串情况。