the*_*heo 552 c# switch-statement
有没有办法在不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;
}
Run Code Online (Sandbox Code Playgroud)
但是我想做这样的事情:
switch (value)
{
case 1,2,3:
//Do Something
break;
case 4,5,6:
//Do Something
break;
default:
//Do the Default
break;
}
Run Code Online (Sandbox Code Playgroud)
这是我用不同的语言思考的语法,还是我错过了什么?
Car*_*lla 675
我想这已经回答了.但是,我认为您仍然可以通过以下方式在语法上更好地混合两个选项:
switch (value)
{
case 1: case 2: case 3:
// Do Something
break;
case 4: case 5: case 6:
// Do Something
break;
default:
// Do Something
break;
}
Run Code Online (Sandbox Code Playgroud)
Bri*_*ndy 303
对于您提到的第二种方法,C++和C#都没有语法.
你的第一种方法没有错.但是,如果你有很大的范围,只需使用一系列if语句.
小智 71
此语法来自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
Run Code Online (Sandbox Code Playgroud)
您不能在C#中使用此语法.相反,您必须使用第一个示例中的语法.
Ste*_*mez 56
原始问题有点晚了,但我发布这个答案是希望有人使用更新的版本(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
Run Code Online (Sandbox Code Playgroud)
笔记:
(
并且)
在when
条件中不是必需的,但在本示例中用于突出显示比较.var
也可以用来代替int
.例如:case var n when n >= 7:
.All*_*ind 32
你可以省略换行符给你:
case 1: case 2: case 3:
break;
Run Code Online (Sandbox Code Playgroud)
但我认为那种糟糕的风格.
Luc*_*eni 18
.NET Framework 3.5有范围:
您可以将它与"contains"和IF语句一起使用,因为有人说SWITCH语句使用"=="运算符.
这是一个例子:
int c = 2;
if(Enumerable.Range(0,10).Contains(c))
DoThing();
else if(Enumerable.Range(11,20).Contains(c))
DoAnotherThing();
Run Code Online (Sandbox Code Playgroud)
但我认为我们可以获得更多乐趣:因为您不需要返回值而且此操作不带参数,您可以轻松使用操作!
public static void MySwitchWithEnumerable(int switchcase, int startNumber, int endNumber, Action action)
{
if(Enumerable.Range(startNumber, endNumber).Contains(switchcase))
action();
}
Run Code Online (Sandbox Code Playgroud)
这个新方法的旧例子:
MySwitchWithEnumerable(c, 0, 10, DoThing);
MySwitchWithEnumerable(c, 10, 20, DoAnotherThing);
Run Code Online (Sandbox Code Playgroud)
由于您传递的是动作,而不是值,因此您应该省略括号,这非常重要.如果需要带参数的函数,只需更改Action
to 的类型即可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);
}
Run Code Online (Sandbox Code Playgroud)
这里有一个新功能导入语句如何比旧命令更强大和优雅的例子.
Car*_*lin 11
这是完整的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;
}
Run Code Online (Sandbox Code Playgroud)
也可以使用字符串...
switch (mystring)
{
case var s when new[] { "Alpha","Beta","Gamma" }.Contains(s):
//Do Something
break;
...
}
Run Code Online (Sandbox Code Playgroud)
C#9 带来了关系模式匹配。这使我们能够做到:
switch (value)
{
case 1 or 2 or 3:
// Do stuff
break;
case 4 or 5 or 6:
// Do stuff
break;
default:
// Do stuff
break;
}
Run Code Online (Sandbox Code Playgroud)
关系模式允许程序员表达与常量值相比,输入值必须满足关系约束
在 C# 8.0 中,您可以使用新的switch 表达式语法,它非常适合您的情况。
var someOutput = value switch
{
>= 1 and <= 3 => <Do some stuff>,
>= 4 and <= 6 => <Do some different stuff>,
_ => <Default stuff>
};
Run Code Online (Sandbox Code Playgroud)
小智 8
@ Jennifer Owens:你绝对正确,下面的代码不起作用:
case 1 | 3 | 5:
//not working do something
Run Code Online (Sandbox Code Playgroud)
唯一的方法是:
case 1: case 2: case 3:
// do something
break;
Run Code Online (Sandbox Code Playgroud)
你正在寻找的代码适用于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()
{
...
}
Run Code Online (Sandbox Code Playgroud)
Alt键
switch (x)
{
case 1:
case 2:
case 3:
DoSomething();
break;
...
}
private void DoSomething()
{
...
}
Run Code Online (Sandbox Code Playgroud)
在 C# 7 中,我们现在有模式匹配,因此您可以执行以下操作:
switch (age)
{
case 50:
ageBlock = "the big five-oh";
break;
case var testAge when (new List<int>()
{ 80, 81, 82, 83, 84, 85, 86, 87, 88, 89 }).Contains(testAge):
ageBlock = "octogenarian";
break;
case var testAge when ((testAge >= 90) & (testAge <= 99)):
ageBlock = "nonagenarian";
break;
case var testAge when (testAge >= 100):
ageBlock = "centenarian";
break;
default:
ageBlock = "just old";
break;
}
Run Code Online (Sandbox Code Playgroud)
C#中一个鲜为人知的切换方面是它依赖于operator =并且因为它可以被覆盖你可以有这样的东西:
string s = foo();
switch (s) {
case "abc": /*...*/ break;
case "def": /*...*/ break;
}
Run Code Online (Sandbox Code Playgroud)
gcc实现了C语言的扩展,以支持顺序范围:
switch (value)
{
case 1...3:
//Do Something
break;
case 4...6:
//Do Something
break;
default:
//Do the Default
break;
}
Run Code Online (Sandbox Code Playgroud)
编辑:刚刚注意到问题上的C#标签,所以大概是gcc的答案没有帮助.
我认为这个在 C# 7 或更高版本中更好。
switch (value)
{
case var s when new[] { 1,2 }.Contains(s):
// Do something
break;
default:
// Do the default
break;
}
Run Code Online (Sandbox Code Playgroud)
您还可以在 C# switch case 中检查 Range:Switch case: can I use a rangerather not a one number
或者
int i = 3;
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;
}
Run Code Online (Sandbox Code Playgroud)
或者如果您想了解 C# switch case的基础知识
C# 8 方法:
var value = 5;
var output = value switch
{
1 or 2 or 3 => value + 4,// Do some stuff
4 => value * 3,// Do some different stuff
5 => value / 3,// Do some different stuff
6 => value - 3,// Do some different stuff
_ => value // Default stuff
};
Run Code Online (Sandbox Code Playgroud)