Выражение переключателя с # 8: обрабатывать несколько случаев одновременно?

В 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

or

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

но ни один из них не действителен.

Также не нашел ни одного примера по этому поводу. Это вообще поддерживается?


person Ray    schedule 07.07.2019    source источник


Ответы (1)


В конечном итоге вы можете использовать < strong> var pattern в сочетании с case guard ( предложение when). Не уверен, что это лучше, чем вариант с повторяющимися возвращаемыми значениями, но вот он:

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
};
person Ivan Stoev    schedule 07.07.2019
comment
Это, вероятно, лучшее решение на данный момент, даже если оно немного нечитаемое (ошибка C #). Не уверен, что я действительно использую его в источнике, но это хорошо отвечает на мой вопрос. :) - person Ray; 07.07.2019
comment
Вам не нужно присваивать переменную v, поскольку вы ничего с ней не делаете. Это просто может быть _ when gameType == GameType.RoyalBattleLegacy || gameType == GameType.RoyalBattleNew - person Elisabeth; 07.02.2020