use*_*162 59 c# switch-statement
我想用switch,但我有很多情况,有没有捷径?到目前为止,我所知道和尝试的唯一解决方案是:
switch (number)
{
case 1: something; break;
case 2: other thing; break;
...
case 9: .........; break;
}
Run Code Online (Sandbox Code Playgroud)
我希望我能做的是:
switch (number)
{
case (1 to 4): do the same for all of them; break;
case (5 to 9): again, same thing for these numbers; break;
}
Run Code Online (Sandbox Code Playgroud)
在此先感谢您的帮助!
Ste*_*mez 156
对于这个问题,游戏有点晚了,但是最近在C#7中引入的更改(默认情况下在Visual Studio 2017/.NET Framework 4.6.2中可用),现在可以使用该switch语句进行基于范围的切换.
例:
int i = 63;
switch (i)
{
case int n when (n >= 100):
Console.WriteLine($"I am 100 or above: {n}");
break;
case int n when (n < 100 && n >= 50 ):
Console.WriteLine($"I am between 99 and 50: {n}");
break;
case int n when (n < 50):
Console.WriteLine($"I am less than 50: {n}");
break;
}
Run Code Online (Sandbox Code Playgroud)
笔记:
(并且)在when条件中不是必需的,但在本示例中用于突出显示比较.var也可以用来代替int.例如:case var n when n >= 100:.小智 44
这是一个更好,更优雅的问题解决方案.
int mynumbercheck = 1000;
// Your number to be checked
var myswitch = new Dictionary <Func<int,bool>, Action>
{
{ x => x < 10 , () => //Do this!... },
{ x => x < 100 , () => //Do this!... },
{ x => x < 1000 , () => //Do this!... },
{ x => x < 10000 , () => //Do this!... } ,
{ x => x < 100000 , () => //Do this!... },
{ x => x < 1000000 , () => //Do this!... }
};
Run Code Online (Sandbox Code Playgroud)
现在调用我们的条件开关
myswitch.First(sw => sw.Key(mynumbercheck)).Value();
Run Code Online (Sandbox Code Playgroud)
A.B*_*uin 35
为了完成线程,这里是 C# 8 和 C# 9 的语法:
C# 8 语法:
var percent = price switch
{
var n when n >= 1000000 => 7f,
var n when n >= 900000 => 7.1f,
var n when n >= 800000 => 7.2f,
_ => 0f // default value
};
Run Code Online (Sandbox Code Playgroud)
如果要指定范围:
var percent = price switch
{
var n when n >= 1000000 => 7f,
var n when n < 1000000 && n >= 900000 => 7.1f,
var n when n < 900000 && n >= 800000 => 7.2f,
_ => 0f // default value
};
Run Code Online (Sandbox Code Playgroud)
C# 9 语法:
var percent = price switch
{
>= 1000000 => 7f,
>= 900000 => 7.1f,
>= 800000 => 7.2f,
_ => 0f // default value
};
Run Code Online (Sandbox Code Playgroud)
如果要指定范围:
var percent = price switch
{
>= 1000000 => 7f,
< 1000000 and >= 900000 => 7.1f,
< 900000 and >= 800000 => 7.2f,
_ => 0f // default value
};
Run Code Online (Sandbox Code Playgroud)
gra*_*ine 16
我会使用三元运算符来对您的开关条件进行分类。
所以...
switch( number > 9 ? "High" :
number > 5 ? "Mid" :
number > 1 ? "Low" : "Floor")
{
case "High":
do the thing;
break;
case "Mid":
do the other thing;
break;
case "Low":
do something else;
break;
case "Floor":
do whatever;
break;
}
Run Code Online (Sandbox Code Playgroud)
小智 8
在这种情况下应该使用if-else,但如果由于任何原因仍然需要切换,您可以执行以下操作,首先没有中断的情况将传播直到遇到第一个中断.如前所述,我建议我推荐if-else over switch.
switch (number){
case 1:
case 2:
case 3:
case 4: //do something;
break;
case 5:
case 6:
case 7:
case 8:
case 9: //Do some other-thing;
break;
}
Run Code Online (Sandbox Code Playgroud)
小智 6
间隔是恒定的:
int range = 5
int newNumber = number / range;
switch (newNumber)
{
case (0): //number 0 to 4
break;
case (1): //number 5 to 9
break;
case (2): //number 10 to 14
break;
default: break;
}
Run Code Online (Sandbox Code Playgroud)
除此以外:
if else
Run Code Online (Sandbox Code Playgroud)
如前所述if-else,在这种情况下会更好,您将处理一个范围:
if(number >= 1 && number <= 4)
{
//do something;
}
else if(number >= 5 && number <= 9)
{
//do something else;
}
Run Code Online (Sandbox Code Playgroud)
switch通过结合使用List您的界限,可以构造“手柄”范围。
List<int> bounds = new List<int>() {int.MinValue, 0, 4, 9, 17, 20, int.MaxValue };
switch (bounds.IndexOf(bounds.Last(x => x < j)))
{
case 0: // <=0
break;
case 1: // >= 1 and <=4
break;
case 2: // >= 5 and <=9
break;
case 3: // >= 10 and <=17
break;
case 4: // >= 18 and <=20
break;
case 5: // >20
break;
}
Run Code Online (Sandbox Code Playgroud)
使用此方法,范围可以具有不同的跨度。