开关中的多个案例:

我相信我已经看到了这个地方,但我不记得它是不是一种不同的语言,或者我只是不记得语法。

有没有一种方法可以通过多个案例陈述而没有陈述案例价值:反复?

我知道这个作品:

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语句。

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

 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#中使用这个语法。 相反,您必须使用第一个示例中的语法。

你可以省略换行符给你:

 case 1: case 2: case 3: break; 

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

.NET Framework 3.5有范围:

来自MSDN的Enumerable.Range

你可以使用它与“包含”和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的types更改为Action<ParameterType> 。 如果您需要返回值,请使用Func<ParameterType, ReturnType>

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

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

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

@詹妮弗·欧文斯:你是绝对正确的下面的代码将无法正常工作:

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

唯一的方法是:

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

你正在寻找的代码在visual basic中工作,你可以很容易地把范围…没有select开关,或者如果其他块方便,我build议,在极端的一点,使用visual basic的.dll导入到你的C#项目。

注意:visual basic中的开关相当于select case。

不幸的是,2008年的C#不支持这个,但是我在一个老问题上发布了这个答案,希望有人使用更新的版本(C#7 – 在Visual Studio 2017 / .NET Framework 4.6.2中默认提供) ,会觉得很有帮助。

在C#7中, switch语句现在可以实现基于范围的切换,并有助于OP的问题。

例:

 int i = 5; switch (i) { case int n when (n >= 7): Console.WriteLine($"I am 7 or above: {n}"); break; case int n when (n >= 4 && n <= 6 ): Console.WriteLine($"I am between 4 and 6: {n}"); break; case int n when (n <= 3): Console.WriteLine($"I am 3 or less: {n}"); break; } // Output: I am between 4 and 6: 5 

C#中一个较less人知道的方面就是它依赖于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; } 

编辑 :只是注意到问题上的C#标记,所以大概是海湾合作委员会的答案没有帮助。

另一种select是使用例程。 如果情况1-3全部执行相同的逻辑,则将该逻辑包装在例程中并针对每个情况进行调用。 我知道这实际上并没有摆脱案件陈述,但它确实实施了良好的风格,并保持在最低限度的…..

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

 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() { ... } 

其实我也不喜欢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

似乎已经投入了大量的工作,想方设法让C#最less使用的语法之一看起来更好或更好地工作。 就我个人而言,我发现switch语句很less使用。 我强烈build议分析你正在testing的数据和你想要的最终结果。

举例来说,假设您想快速testing已知范围内的值,看看它们是否是素数。 你想避免让你的代码做浪费的计算,你可以find你想要在线范围内的素数列表。 您可以使用大量的switch语句将每个值与已知的素数进行比较。

或者你可以创build一个素数的数组映射并得到直接的结果:

  bool[] Primes = new bool[] { false, false, true, true, false, true, false, true, false, false, false, true, false, true, false,false,false,true,false,true,false}; private void button1_Click(object sender, EventArgs e) { int Value = Convert.ToInt32(textBox1.Text); if ((Value >= 0) && (Value < Primes.Length)) { bool IsPrime = Primes[Value]; textBox2.Text = IsPrime.ToString(); } } 

也许你想看看一个string中的字符是hex的。 你可以使用一个非常小的开关语句。

或者,您可以使用任何正则expression式来testing字符,或使用IndexOf函数来search已知hexstring中的字符:

  private void textBox2_TextChanged(object sender, EventArgs e) { try { textBox1.Text = ("0123456789ABCDEFGabcdefg".IndexOf(textBox2.Text[0]) >= 0).ToString(); } catch { } } 

让我们假设你想要执行3种不同的操作之一,取决于1到24范围内的值。我build议使用一组IF语句。 如果这变得太复杂了(或者数字更大,例如取决于1到90范围内的值的5个不同动作),那么使用枚举来定义动作并创build枚举的数组映射。 该值将被用于索引到数组映射中,并获得所需操作的枚举。 然后使用一小组IF语句或一个非常简单的switch语句来处理生成的枚举值。

另外,关于将一系列值转换为操作的数组映射的好处是可以通过代码轻松更改。 使用硬连线代码,您不能在运行时轻松更改行为,但使用数组映射很容易。

为此,您可以使用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(); }