c# - case语句 - switch case c++




switch语句中有多个case (10)

.NET Framework 3.5有范围:

来自MSDN的Enumerable.Range

您可以将它与“contains”和IF语句一起使用,因为像有人说SWITCH语句使用“==”运算符。

这里是一个例子:

int c = 2;
if(Enumerable.Range(0,10).Contains(c))
    DoThing();
else if(Enumerable.Range(11,20).Contains(c))
    DoAnotherThing();

但我认为我们可以有更多的乐趣:因为你不需要返回值,并且这个动作不需要参数,所以你可以很容易地使用动作!

public static void MySwitchWithEnumerable(int switchcase, int startNumber, int endNumber, Action action)
{
    if(Enumerable.Range(startNumber, endNumber).Contains(switchcase))
        action();
}

这个新方法的旧例子:

MySwitchWithEnumerable(c, 0, 10, DoThing);
MySwitchWithEnumerable(c, 10, 20, DoAnotherThing);

既然你传递的是行为,而不是值,你应该省略括号,这是非常重要的。 如果您需要带参数的函数,只需将Action的类型更改为Action<ParameterType> 。 如果您需要返回值,请使用Func<ParameterType, ReturnType>

在C#3.0中,没有简单的部分应用程序来封装case参数相同的事实,但是您创建了一个小辅助方法(有点冗长,tho)。

public static void MySwitchWithEnumerable(int startNumber, int endNumber, Action action){ 
    MySwitchWithEnumerable(3, startNumber, endNumber, action); 
}

这里是一个例子,说明新功能导入语句是如何比旧命令更强大和优雅的。

有没有办法通过多个案例陈述而没有陈述case value:反复?

我知道这是有效的:

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中工作,你可以很容易地将范围放在......没有选择开关,或者如果其他块很方便,我建议在极端点使用Visual Basic制作.dll并导入到你的C#项目。

注意:visual basic中的开关等效于select case。


gcc实现了对C语言的扩展以支持顺序范围:

switch (value)
{
   case 1...3:
      //Do Something
      break;
   case 4...6:
      //Do Something
      break;
   default:
      //Do the Default
      break;
}

编辑 :刚才注意到问题上的C#标签,所以大概gcc的答案没有帮助。


为此,您可以使用goto语句。 如:

    switch(value){
    case 1:
        goto case 3;
    case 2:
        goto case 3;
    case 3:
        DoCase123();
    //This would work too, but I'm not sure if it's slower
    case 4:
        goto case 5;
    case 5:
        goto case 6;
    case 6:
        goto case 7;
    case 7:
        DoCase4567();
    }

你可以省略换行符给你:

case 1: case 2: case 3:
   break;

但我认为那种不好的风格。


其实我也不喜欢GOTO命令,但它是在官方的MS资料中,这里是所有允许的语法。

如果切换部分的语句列表的结束点可到达,则会发生编译时错误。 这被称为“不通过”规则。 这个例子

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();
}

导致编译时错误。 当执行一个开关部分后,执行另一个开关部分时,必须使用一个显式的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,它实际上是唯一可以实现的方式。

来源: http://msdn.microsoft.com/en-us/library/aa664749%28v=vs.71%29.aspx : http://msdn.microsoft.com/en-us/library/aa664749%28v=vs.71%29.aspx


如果你有大量的字符串(或任何其他类型)的情况都做同样的事情,我推荐使用字符串列表结合string.Contains属性。

所以如果你有这样一个大的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
}

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


对于你提到的第二种方法,C ++和C#都没有语法。

你的第一种方法没有问题。 如果你有很大的范围,只需要使用一系列的if语句。


我想这已经得到了回答。 不过,我认为你仍然可以通过下面的语法更好地混合两个选项:

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

此语法来自Visual Basic Select ... Case语句

Dim number As Integer = 8
Select Case number
    Case 1 To 5
        Debug.WriteLine("Between 1 and 5, inclusive")
        ' The following is the only Case clause that evaluates to True.
    Case 6, 7, 8
        Debug.WriteLine("Between 6 and 8, inclusive")
    Case Is < 1
        Debug.WriteLine("Equal to 9 or 10")
    Case Else
        Debug.WriteLine("Not between 1 and 10, inclusive")
End Select

你不能在C#中使用这种语法。 相反,您必须使用第一个示例中的语法。





switch-statement