c# 8.0 switch 表达式中的多个案例[重复]

Posted

技术标签:

【中文标题】c# 8.0 switch 表达式中的多个案例[重复]【英文标题】:Multiple cases in c# 8.0 switch expressions [duplicate] 【发布时间】:2019-08-25 21:16:09 【问题描述】:

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

多case的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",  
; 

【问题讨论】:

我也找不到在=>之后添加块代码的方法,普通方法不起作用 问题是什么? C# 8 没有破坏 switch 语句。此代码按原样工作。您是在问开关 表达式 吗? 你能详细说明你真正在说什么吗?您是否有文章链接或提及“聚合多个案例”概念的内容? 他在谈论 c# 8 switch 表达式:docs.microsoft.com/en-us/dotnet/csharp/whats-new/… 我现在明白了,这个问题在 5 月份对我来说还不是很清楚。 【参考方案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()
    ;

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

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

【讨论】:

您已经删除了代码,但想法仍然存在。为什么不做出清晰明了的回答? 非常糟糕效率低下 - 每次都为此分配一个列表......不理想 是的,我自己也不喜欢这种语法,但在发帖时我找不到更干净的解决方案,但我相信 MS 会实现比这更优雅的东西。 @donatasj87 您能否发布计划中的 C# 9 开关表达式增强的链接?谢谢! 我可以确认 C# 9 有第二种语法,我只是成功地使用了它。很干净!【参考方案2】:

这是基于@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,我觉得这需要更长的时间才能弄清楚它在做什么。

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

【讨论】:

所以基本上你可以在任何情况下使用_ when 使其适用于多种条件,我不知道,我不能给你足够多的支持,这正是我一直在做的寻找。

以上是关于c# 8.0 switch 表达式中的多个案例[重复]的主要内容,如果未能解决你的问题,请参考以下文章

c# 8.0 switch 表达式返回类型和空值

新的 C# 8.0 开关表达式的运算符优先级是啥?

带有 void 的 C# 8.0 switch 语句 [重复]

C#各版本新增加功能

C# switch 表达式 null 大小写

C#各版本新增加功能