C# 8 switch 表达式:一次处理多个案例?

Posted

技术标签:

【中文标题】C# 8 switch 表达式:一次处理多个案例?【英文标题】:C# 8 switch expression: Handle multiple cases at once? 【发布时间】:2019-11-17 03:23:28 【问题描述】:

C#8 引入了模式匹配,我已经找到了使用它的好地方,比如这个:

private static GameType UpdateGameType(GameType gameType)

    switch (gameType)
    
        case GameType.RoyalBattleLegacy:
        case GameType.RoyalBattleNew:
            return GameType.RoyalBattle;
        case GameType.FfaLegacy:
        case GameType.FfaNew:
            return GameType.Ffa;
        default:
            return gameType;
    

然后变成

private static GameType UpdateGameType(GameType gameType) => gameType switch

    GameType.RoyalBattleLegacy => GameType.RoyalBattle,
    GameType.RoyalBattleNew => GameType.RoyalBattle,
    GameType.FfaLegacy => GameType.Ffa,
    GameType.FfaNew => GameType.Ffa,
    _ => gameType;
;

但是,您可以看到我现在不得不提到GameType.RoyalBattleGameType.Ffa 两次。有没有办法在模式匹配中一次处理多个案例?我正在考虑这样的事情,但它不是有效的语法:

private static GameType UpdateGameType(GameType gameType) => gameType switch

    GameType.RoyalBattleLegacy, GameType.RoyalBattleNew => GameType.RoyalBattle,
    GameType.FfaLegacy, GameType.FfaNew => GameType.Ffa,
    _ => gameType;
;

我也尝试过

[GameType.RoyalBattleLegacy, GameType.RoyalBattleNew] => GameType.RoyalBattle

GameType.FfaLegacy || GameType.FfaNew => GameType.Ffa

但没有一个是有效的。

也没有找到任何关于此的示例。还支持吗?

【问题讨论】:

【参考方案1】:

您最终可以将var pattern 与case guard (when clause) 结合使用。不确定它是否比具有重复返回值的变体更好,但这里是:

private static GameType UpdateGameType(GameType gameType) => gameType switch

    var v when v == GameType.RoyalBattleLegacy || v == GameType.RoyalBattleNew
        => GameType.RoyalBattle,
    var v when v == GameType.FfaLegacy || v == GameType.FfaNew
        => GameType.Ffa,
    _ => gameType
;

【讨论】:

这可能是目前最好的解决方案,即使有点不可读(C# 的错)。不确定我是否真的会在源代码中使用它,但这很好地回答了我的问题。 :) 你不需要给变量 v 赋值,因为你什么也没做。可以是_ when gameType == GameType.RoyalBattleLegacy || gameType == GameType.RoyalBattleNew【参考方案2】:

从 C#9 开始,您可以通过“析取 or”模式完全按照您的意愿行事:

private static GameType UpdateGameType(GameType gameType) => gameType switch

    GameType.RoyalBattleLegacy or GameType.RoyalBattleNew => GameType.RoyalBattle,
    GameType.FfaLegacy or GameType.FfaNew => GameType.Ffa,
    _ => gameType;
;

进一步阅读:

What's new in C# 9.0: pattern matching enhancements Patterns C# reference

【讨论】:

你完全正确!事实上,自从它推出以来,我一直在使用它,很高兴在这里添加一个新的答案。

以上是关于C# 8 switch 表达式:一次处理多个案例?的主要内容,如果未能解决你的问题,请参考以下文章

c# 8 switch 表达式:没有找到 switch 表达式的最佳类型

有没有办法让 switch 使用 C# 8 switch 表达式返回字符串值?

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

如何声明从 C# 8 switch 表达式返回的参数?

c# 8 switch 表达式不够“聪明”

C# switch 表达式 null 大小写