C#8.0开关中的多种情况

时间:2019-04-04 07:45:40

标签: switch-statement case c#-8.0 switch-expression

在传统的c#开关中,我们有这样的构造,在这里我们可以聚合多个情况。如何在新的c#8.0开关构造中完成?

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;
}

3 个答案:

答案 0 :(得分:5)

这是基于@ donatasj87的答案,因此主要归功于他们,但我只是想建议一种稍有不同的编写方式。

List<int> oneToThree = new List<int>() { 1, 2, 3 };

int GetValue(int val) => val switch
{
    _ when oneToThree.Contains(val) => DoSomeStuff(),
    _ when val == 4 || val == 5 || val == 6 => DoSomeDifferentSwitch(),
    _ => DefaultSwitch()
};

_ when可以被认为是“ else when”,而_则是“ else”。

通过这种方式,您不必先将val重新定义为i,然后再将其重新定义为j,我认为需要花费更长的时间才能确定其工作方式。 / p>

@ donatasj87提到的C#9版本在可用时会更好,前提是仍在计划中。

答案 1 :(得分:3)

我认为应该以更简洁的方式来实现,但是我这样做的方式是这样的:

private int GetValue(int val) =>
    val switch
    {
        int i when new List<int> {1, 2, 3}.Contains(i) => DoSomeStuff(),
        int j when (j == 6 || j == 5 || j == 4) => DoSomeDifferentSwitch(),
        _ => DefaultSwitch()
    };

编辑: 这是针对C#9计划的:

colorBand switch
    {
        Rainbow.Red or Rainbow.Orange => new RGBColor(0xFF, 0x7F, 0x00),
        _ => throw new ArgumentException(message: "invalid enum value", paramName: nameof(colorBand)),
    };

答案 2 :(得分:0)

我认为目前无法实现此操作,您可以在此处switch expressions from C# 8.0

检查各种用法