切换案例:我可以使用范围而不是一个数字

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:.

  • @JamesKo与一堆if语句相比,我觉得它很干净,提高了可读性,特别是如果你有超过3-4个条件. (7认同)
  • 先生,是我的英雄.我想用一些发誓的话来强调这一点,而不是.:) (6认同)
  • `when`条件周围的`(`和`)`是不必要的.即,当n> = 100时,`case int n:`也可以. (2认同)
  • 甚至`var`也可以工作:即当n> = 100时``var var:`. (2认同)
  • 远远优于一堆 if 语句,它更干净。 (2认同)

小智 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)

替换Switch/ifElse

  • Dictionary不会按照添加它们的顺序存储和返回值.这恰好与Microsoft编译器一起使用,但是可以轻松地编写一个不起作用的complient编译器.而是使用List <KeyValuePair <Func <int,bool>,Action >>.还要注意,生成数据结构需要花费成本,因此它应该是静态只读成员. (8认同)

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)

  • 优雅的!凉爽的!还有史诗般的措辞。是否可以使用枚举及其状态来代替 High、Mid、Low 和 Floor 的字符串? (2认同)

小智 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)


hen*_*rik 5

如前所述if-else,在这种情况下会更好,您将处理一个范围:

if(number >= 1 && number <= 4)
{
   //do something;
}
else if(number >= 5 && number <= 9)
{
   //do something else;
}
Run Code Online (Sandbox Code Playgroud)


use*_*756 5

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)

使用此方法,范围可以具有不同的跨度。


小智 3

如果您使用 C/C++,则没有“范围”语法。您只能在每个“case”段之后列出所有值。语言 Ada 或 Pascal 支持范围语法。