web-dev-qa-db-ja.com

c#8スイッチ式の複数のケースで同じ結果

同じ結果を返す複数のケースをサポートするには、switch式をどのように記述する必要がありますか?

バージョン8より前のc#では、スイッチは次のように記述できます。

var switchValue = 3;
var resultText = string.Empty;
switch (switchValue)
{
    case 1:
    case 2:
    case 3:
        resultText = "one to three";
        break;
    case 4:
        resultText = "four";
        break;
    case 5:
        resultText = "five";
        break;
    default:
        resultText = "unkown";
        break;
}

C#バージョン8の式の構文を使用しているときは、次のようになります。

var switchValue = 3;
var resultText = switchValue switch
{
    1 => "one to three",
    2 => "one to three",
    3 => "one to three",
    4 => "four",
    5 => "five",
    _ => "unknown",
};

だから私の質問は:値を繰り返す必要がないように、ケース1、2、3を1つのスイッチケースアームにする方法は?

Rufus L」からの提案ごとに更新:

私の与えられた例ではこれはうまくいきます。

var switchValue = 3;
var resultText = switchValue switch
{
    var x when (x >= 1 && x <= 3) => "one to three",
    4 => "four",
    5 => "five",
    _ => "unknown",
};

しかし、それはまさに私が達成したいことではない。これはまだ1つのケース(フィルター条件付き)であり、複数のケースが同じ右側の結果をもたらすわけではありません。

35
huzle

スイッチタイプがフラグ列挙型の場合

[System.Flags]
public enum Values 
{
    One = 1, 
    Two = 2, 
    Three = 4,
    Four = 8,
    OneToThree = One | Two | Three
}

var resultText = switchValue switch
{
    var x when Values.OneToThree.HasFlag(x) => "one to three",
    Values.Four => "4",
    _ => "unknown",
};
0
pcchan