C#中的Switch语句

20

有人知道在switch语句中是否能包含一个范围吗?如果可以,怎么做呢?

比如:

switch (x)
{
   case 1:
     //do something
     break;
   case 2..8:
     //do something else
     break;
   default:
     break;
}
编译器似乎不喜欢这种语法 - 它也不喜欢这个:
case <= 8:
10个回答

31
不,这是不可能的。过去我曾尝试了几种方法:
固定编码:
switch (x)
{
   case 1:
     //do something
     break;
   case 2:
   case 3:
   case 4:
   case 5:
   case 6:
   case 7:
   case 8:
     //do something else
     break;
   default:
     break;
}

if {} 语句结合使用:

switch (x)
{
   case 1:
     //do something
     break;
   default:
     if (x <= 8)
     {
        // do something
     }
     else
     {
       // throw exception
     }
     break;
}

2
第二个例子加1。第一个让我想伤人。 :) - Bobby Cannon
第一个例子看起来很奇怪:我知道这对Java等语言是正确的,但是switchMSDN条目明确说明编译器不允许“穿透”。或者我有什么地方理解错误吗? - Informagic
好的,显然这对于“空”case是允许的。 - Informagic

8
不可以,但你可以这样写,这样你至少避免了多次写 // do something else 的部分。
switch (x)
{
   case 1:
     //do something
     break;
   case 2: case 3: case 4: case 5: case 6: case 7: case 8:
     //do something else
     break;
   default:
     break;
}

已经在上面提到过,但格式化非常重要 :) 我关心沟通。 - Mike M

7

虽然当我最初提出这个问题时这是不可能的,但通过 C# 模式匹配的奇迹,现在可以实现了(在 C# 7 中):

switch (i)
{
    case var test when test <= 2:
        Console.WriteLine("Less than 2");
        break;

    case var test when test > 2 && test < 10:
        Console.WriteLine("Between 2 and 10");
        break;

    case var test when test >= 10:
        Console.WriteLine("10 or more");
        break;
}
关于该主题的博客文章

3

一种可能性是将您的范围转换为整数。例如:

//assuming x>=9 or if (x <= 0) return;
        switch((x+12)/7)
        {   case 1:Console.WriteLine("one");
                break;
            case 2:Console.WriteLine("2 through 8 inclusive");
                break;
            case 3:Console.WriteLine("9 through 15 inclusive");
                break;
            default: Console.WriteLine("16 or more");
                break;
        }

3

简短回答: 不行。虽然可以将所有情况都写出来,但是这样的范围表示法是不被支持的。

我认为你需要在这里使用if语句或切换到一个更好支持情况区分的语言。


2
如果情况很少,最好使用if

1

你可以逐个处理显式的情况,如果只有一个范围,则在默认情况下处理它。


-1

你可以做到

case 2:
case 3:
case 4:
...
case 8:
 // code here
 break

[-] 这个答案已经由Andy Shellam在上面提供了。 - Leo Gurdian

-1

你可以使用 case 穿透:

switch (x)
{
   case 1:
     //do something
     break;
   case 2:
   case 3:
   case 4:
   case 5:
   case 6:
   case 7:
   case 8:
     //do something else
     break;
   default:
     break;
}

但我只会在这里使用它。


[-] 此答案已由Andy Shellam提供。 - Leo Gurdian

-1

在switch case中不能使用任何条件语句。

如果您想要为不同的选项执行相同的代码行,则可以采取以下措施:

switch (i)
            {
                case 0:
                case 1:
                case 2: 
                case 3:
                    //do something here.
                    break;
                default:
                    //do something here.
                    break;
            }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接