新しいSwitch文

サポート

.NetCore3.x-

基本コード

Before

c#のバージョン7までは、次のようにとしてコーディングしていました。

static string NumberBefore(int num)
{
    switch (num)
    {
        case 1:
            return "1です";
        case 2:
            return "2です";
        default:
            return "1と2以外です";
    }
}

このメソッドについて

1を引数として渡された場合、 「1です」を戻り値とする。
2を引数として渡された場合、 「2です」を戻り値とする。
それ以外の場合、 「1と2以外です」を戻り値とする。

After

バージョン8からは、スイッチをとして書けるようになりました。

static string NumberAfter(int num)
{
    string result;

    result = num switch
    {
        1 => "1です",
        2 => "2です",
        _ => "1と2以外です",
    };
    return result;
}

一次変数のresultを省略して(インテリセンスで「インラインの一時変数」を選択しても良い)

static string NumberAfter(int num)
{
    return num switch
    {
        1 => "1です",
        2 => "2です",
        _ => "1と2以外です",
    };
}

メソッドに式本体を利用する

メソッドのシグネチャをクリックして、カーソルを移動し、インテリセンスのヒントから変換します。

static string NumberAfter(int num) => num switch
{
    1 => "1です",
    2 => "2です",
    _ => "1と2以外です",
};

LINQで使った場合

ラムダ式

1行でまとめると

string[] strNums = nums.Select(num => num switch { 1 => "1です", 2 => "2です", _ => "1と2以外です", }).ToArray();

見易く改行

string[] strNums = nums.Select(num => num switch
{
    1 => "1です",
    2 => "2です",
    _ => "1と2以外です",
}).ToArray();

次からのコードは、インテリセンスで候補変換できます。
ラムダ記号=> の真ん中(=と>の間)をクリックして、カーソルを移動し、インテリセンスのヒントから変換します。

メソッドを分割した場合

static string Method(int num)
{
    return num switch
    {
        1 => "1です",
        2 => "2です",
        _ => "1と2以外です",
    };
}
public static void Main(string[] args)
{
    int[] nums = { 1, 2, 3 };

    string[] strNums = nums.Select(Method).ToArray();
}

ローカル関数

int[] nums = { 1, 2, 3 };

Func<int, string> selector = num => num switch
    {
        1 => "1です",
        2 => "2です",
        _ => "1と2以外です",
    };
string[] strNums = nums.Select(selector).ToArray();

匿名メソッド

int[] nums = { 1, 2, 3 };

string[] strNums = nums.Select(delegate (int num)
{
    return num switch
    {
        1 => "1です",
        2 => "2です",
        _ => "1と2以外です",
    };
}).ToArray();

8.0バージョン

Posted by hidepon