有没有办法在不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; }
这是我用不同的语言思考的语法,还是我错过了什么?
我想这已经回答了.但是,我认为您仍然可以通过以下方式在语法上更好地混合两个选项:
switch (value) { case 1: case 2: case 3: // Do Something break; case 4: case 5: case 6: // Do Something break; default: // Do Something 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#中使用此语法.相反,您必须使用第一个示例中的语法.
原始问题有点晚了,但我发布这个答案是希望有人使用更新的版本(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
笔记:
括号(
并且)
在when
条件中不是必需的,但在本示例中用于突出显示比较.
var
也可以用来代替int
.例如:case var n when n >= 7:
.
你可以省略换行符给你:
case 1: case 2: case 3: break;
但我认为那种糟糕的风格.
.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
to 的类型即可Action
.如果您需要返回值,请使用Func
.
在C#3.0中没有简单的部分应用程序来封装case参数相同的事实,但你创建了一个小帮助方法(有点冗长,tho).
public static void MySwitchWithEnumerable(int startNumber, int endNumber, Action action){ MySwitchWithEnumerable(3, startNumber, endNumber, action); }
这里有一个新功能导入语句如何比旧命令更强大和优雅的例子.
这是完整的C#7解决方案...
switch (value) { case var s when new[] { 1,2,3 }.Contains(s): //Do Something break; case var s when new[] { 4,5,6 }.Contains(s): //Do Something break; default: //Do the Default break; }
也可以使用字符串...
switch (mystring) { case var s when new[] { "Alpha","Beta","Gamma" }.Contains(s): //Do Something break; ... }
@ Jennifer Owens:你绝对正确,下面的代码不起作用:
case 1 | 3 | 5: //not working do something
唯一的方法是:
case 1: case 2: case 3: // do something break;
你正在寻找的代码适用于visual basic,你可以很容易地放置范围...在没有选项的开关或if else块方便,我建议,在非常极端的点,使用visual basic和导入返回.dll到你的c#项目.
注意:visual basic中的等效开关是select case.
另一种选择是使用例程.如果案例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() { ... }
C#中一个鲜为人知的切换方面是它依赖于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#标签,所以大概是gcc的答案没有帮助.