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.RoyalBattle
和GameType.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 表达式的最佳类型