我想使用开关,但我有很多情况,有没有快捷方式?到目前为止,我所知道和尝试的唯一解决方案是:
switch (number)
{
case 1: something; break;
case 2: other thing; break;
...
case 9: .........; break;
}
我希望我能做的是:
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;
}
答案 0 :(得分:128)
此问题的游戏稍晚,但在最近的更改中introduced in C# 7(在Visual Studio 2017 / .NET Framework 4.6.2中默认可用),现在可以使用{{进行基于范围的切换1}}陈述。
示例:强>
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;
}
条件中不需要括号(
和)
,但在此示例中使用括号来突出显示比较。 when
也可用于代替var
。例如:int
。答案 1 :(得分:40)
这是一个更好,更优雅的问题解决方案。
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!... }
};
现在调用我们的条件开关
myswitch.First(sw => sw.Key(mynumbercheck)).Value();
答案 2 :(得分:9)
在这种情况下应该使用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;
}
答案 3 :(得分:7)
间隔是恒定的:
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;
}
否则:
if else
答案 4 :(得分:5)
你可以switch
构建&#34;处理&#34;通过将其与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;
}
通过这种方法,范围可以有不同的范围。
答案 5 :(得分:2)
如上所述if-else
会更好,在这种情况下,您将处理范围:
if(number >= 1 && number <= 4)
{
//do something;
}
else if(number >= 5 && number <= 9)
{
//do something else;
}
答案 6 :(得分:2)
我将使用三元运算符对您的切换条件进行分类。
所以...
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;
}
答案 7 :(得分:1)
如果使用C / C ++,则没有“范围”语法。您只能列出每个“案例”段后的所有值。 语言Ada或Pascal支持范围语法。
答案 8 :(得分:1)
在.Net中,Visual Basic允许在switch语句中使用范围,但在C#中没有有效的语法。
解决你在C#中的具体问题,我会解决它:
if(number >= 1 && number <= 9) // Guard statement
{
if(number < 5)
{
// Case (1 to 4):
//break;
}
else
{
// Case (5 to 9):
//break;
}
}
else
{
// Default code goes here
//break;
}
为了进一步说明这一点,假设你有一个百分比值。
将问题用作模板,您可能希望看起来像这样:
switch (percentage)
{
case (0 to 19):
break;
case (20 to 39):
break;
case (40 to 69):
break;
case (70 to 79):
break;
case (80 to 100):
break;
default:
break;
}
但是,由于C#不允许使用该语法,因此这是C#允许的解决方案:
if (percentage >= 0 && percentage <= 100) // Guard statement
{
if (percentage >= 40)
{
if (percentage >= 80)
{
// Case (80% to 100%)
//break;
}
else
{
if (percentage >= 70)
{
// Case (70% to 79%)
//break;
}
else
{
// Case (40% to 69%)
//break;
}
}
}
else
{
if (percentage >= 20)
{
// Case (20% to 39%)
//break;
}
else
{
// Case (0% to 19%)
//break;
}
}
}
else
{
// Default code goes here
//break;
}
可能需要一点时间习惯,但一旦你得到它就没问题了。
就个人而言,我欢迎switch语句允许范围。
C#转换语句的未来
以下是我对如何改进switch语句的一些想法:
版本A
switch(value)
{
case (x => x >= 1 && x <= 4):
break;
case (x => x >= 5 && x <= 9):
break;
default:
break;
}
版本B
switch(param1, param2, ...)
{
case (param1 >= 1 && param1 <= 4):
break;
case (param1 >= 5 && param1 <= 9 || param2 != param1):
break;
default:
break;
}
答案 9 :(得分:0)
首先,您应该指定您所指的编程语言。
其次,switch
语句适用于关于切换变量的封闭选项集,例如枚举或预定义的字符串。对于这种情况,我建议使用良好的旧if-else
结构。
答案 10 :(得分:0)
在C#开关中,案例基本上是下一步的字典。由于您无法在字典中查找范围,因此您最好的情况是……提到语句史蒂夫·戈麦斯时。
答案 11 :(得分:0)
要完成线程,这是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
};
如果要指定范围:
var percent2 = 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
};
答案 12 :(得分:0)
如果范围很小,您可以通过案例达到同一点。例如:
int number = 3;
switch (number)
{
case 1:
case 2:
case 3:
case 4:
Console.WriteLine("Number is <= 1 <= 4");
break;
case 5:
Console.WriteLine("Number is 5");
break;
default:
Console.WriteLine("Number is anything else");
break;
}
答案 13 :(得分:-1)
通过switch
案例,这是不可能的。你可以使用嵌套的if语句。
if(number>=1 && number<=4){
//Do something
}else if(number>=5 && number<=9){
//Do something
}
答案 14 :(得分:-1)
如果问题是关于C(你没说),那么答案是否,但是:GCC和Clang(也许是其他人)支持range syntax,但它是< em> not 有效的ISO C:
switch (number) {
case 1 ... 4:
// Do something.
break;
case 5 ... 9:
// Do something else.
break;
}
请务必在...
之前和之后留一个空格,否则会出现语法错误。
答案 15 :(得分:-2)
您可以将if-else语句与||一起使用运营商(或运营商)喜欢:
if(case1 == true || case2 == true || case3 == true)
{
Do this!...
}
else if(case4 == true || case5 == true || case6 == true)
{
Do this!...
}
else if(case7 == true || case8 == true || case9 == true)
{
Do this!...
}