2

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

但没有一个是有效的。

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

4

2 回答 2

5

您最终可以将var模式case guardwhen子句)结合使用。不确定它是否比具有重复返回值的变体更好,但它是:

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
};
于 2019-07-07T12:31:10.910 回答
1

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

private static GameType UpdateGameType(GameType gameType) => gameType switch
{
    GameType.RoyalBattleLegacy or GameType.RoyalBattleNew => GameType.RoyalBattle,
    GameType.FfaLegacy or GameType.FfaNew => GameType.Ffa,
    _ => gameType;
};

进一步阅读:

于 2022-02-11T21:12:27.030 回答