C # 8 сопоставление с образцом: обрабатывать несколько случаев одновременно? - PullRequest
1 голос
/ 07 июля 2019

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 Ответ

3 голосов
/ 07 июля 2019

Вы можете в конечном итоге использовать var pattern в сочетании с case guard ( когда 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
};
...