switch语句中有多种情况

时间:2020-03-05 18:54:57  来源:igfitidea点击:

有没有一种方法可以遍历多个case语句,而无需重复说明" 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;
}

我是从其他语言考虑使用这种语法吗,还是我错过了某些内容?

解决方案

回答

我们提到的第二种方法在C ++中也没有C语法。

第一种方法没有错。但是,如果范围很大,则只需使用一系列if语句。

回答

此语法来自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#中使用此语法。相反,我们必须使用第一个示例中的语法。

回答

在Cis中,开关的一个较鲜为人知的方面是它依赖于operator =,并且由于它可以被覆盖,因此我们可能会遇到以下情况:

string s = foo();

switch (s) {
  case "abc": /*...*/ break;
  case "def": /*...*/ break;
}

回答

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

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

<B>编辑:刚刚注意到问题上的Ctag,所以大概是gcc答案无济于事。

回答

我们可以省略换行符,该换行符为我们提供:

case 1: case 2: case 3:
   break;

但我认为这种风格不好。

回答

另一种选择是使用例程。如果情况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()
{
   ...
}

回答

.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>。

在C3.0中,没有简单的Partial Application来封装case参数相同的事实,但是我们创建了一个小辅助方法(有点冗长,但是)。

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

这是一个示例,说明新的函数式导入语句如何比旧的命令式语句更强大,更优雅。

回答

我想这已经被回答了。但是,我认为我们仍然可以通过以下方法在语法上更好地混合使用这两个选项:

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