19

在传统的 C# switch 中,我们有一个可以聚合多个案例的结构。如何在新的 c# 8.0 switch 表达式中完成?

具有多种情况的 switch 语句:

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

C# 8 开关表达式示例:

var result = value switch  
{  
    1 => "Case 1",  
    2 => "Case 2",  
    3 => "Case 3",  
    4 => "Case 4",  
}; 
4

2 回答 2

19

在我看来,它应该以更干净的方式实现,但我这样做的方式是这样的:

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

编辑:这是为 C# 9 计划的:

colorBand switch
    {
        Rainbow.Red or Rainbow.Orange => new RGBColor(0xFF, 0x7F, 0x00),
        _ => throw new ArgumentException(message: "invalid enum value", paramName: nameof(colorBand)),
    };
于 2019-08-28T06:53:18.930 回答
6

这是基于@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”的意思。

这样你就没有重新定义valfirst asi和 then as j,我觉得这需要更长的时间才能弄清楚它在做什么。

请注意,如果您使用 C# 9,@donatasj87 提到的新版本现在可用。

于 2020-04-29T14:03:34.897 回答