Несколько случаев в переключателе 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