Несколько случаев в переключателе C# 8.0

В традиционном переключателе 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;
}

1 ответ

На мой взгляд, это должно быть реализовано более чище, но я делаю это так:

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

РЕДАКТИРОВАТЬ: это планируется для С # 9:

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

Это основано на ответе @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 можно рассматривать как означающее "иначе, когда", а _ означает просто "еще".

Таким образом, у вас не будет переопределения val сначала как i а затем как j, который, как мне кажется, занимает немного больше времени, чтобы понять, что он делает.

Версия C#9, о которой упоминал @donatasj87, будет лучше, когда она будет доступна, если предположить, что она все еще запланирована.

Я думаю, что это не возможно в настоящее время, вы можете проверить возможное использование varios отсюда переключение выражений из C# 8.0

Другие вопросы по тегам