C# 8 开关表达式:一次处理多个案例?
C# 8 switch expression: Handle multiple cases at once?
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
但 none 有效。
也没有找到这方面的例子。甚至支持吗?
您最终可以使用 var pattern combined with case guard (when clause)。不确定它是否比具有重复 return 值的变体更好,但这里是:
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#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;
};
延伸阅读:
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
但 none 有效。
也没有找到这方面的例子。甚至支持吗?
您最终可以使用 var pattern combined with case guard (when clause)。不确定它是否比具有重复 return 值的变体更好,但这里是:
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#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;
};
延伸阅读: