質問

ラムダ式にスイッチを入れることは可能ですか?そうでない場合、なぜですか? Resharperはエラーとして表示します。

役に立ちましたか?

解決

ステートメントブロックでラムダを使用できます:

Action<int> action = x =>
{
  switch(x)
  {
    case 0: Console.WriteLine("0"); break;
    default: Console.WriteLine("Not 0"); break;
  }
};

ただし、「単一式のラムダ」では実行できないため、これは無効です:

// This won't work
Expression<Func<int, int>> action = x =>
  switch(x)
  {
    case 0: return 0;
    default: return x + 1;
  };

これは、式ツリーでスイッチを使用できないことを意味します(少なくともC#コンパイラによって生成されたもの。少なくとも.NET 4.0はライブラリでサポートしています)。

他のヒント

純粋な Expression (.NET 3.5)では、取得できる最も近いものは複合条件です:

    Expression<Func<int, string>> func = x =>
        x == 1 ? "abc" : (
        x == 2 ? "def" : (
        x == 3 ? "ghi" :
                 "jkl")); /// yes, this is ugly as sin...

おもしろくない、特に複雑になるとき。ステートメント本体を持つlamda式(つまり、LINQ-to-Objectsでのみ使用)を意味する場合、中かっこ内では何でも有効です。

    Func<int, string> func = x => {
        switch (x){
            case 1:  return "abc";
            case 2:  return "def";
            case 3:  return "ghi";
            default: return "jkl";
        }
    };

もちろん、作業を外部委託することもできます。たとえば、LINQ-to-SQLを使用すると、スカラーUDF(データベースで)をデータコンテキスト(実際には使用されていない)のメソッドにマップできます-例:

var qry = from cust in ctx.Customers
          select new {cust.Name, CustomerType = ctx.MapType(cust.TypeFlag) };

MapType は、dbサーバーで作業を行うUDFです。

はい、動作しますが、コードをブロックに入れる必要があります。例:

private bool DoSomething(Func<string, bool> callback)
{
    return callback("FOO");
}

次に、呼び出す:

DoSomething(val =>
                {
                    switch (val)
                    {
                        case "Foo":
                            return true;

                        default:
                            return false;
                    }
                });

うーん、これが機能しない理由はわかりません。使用する構文に注意してください

param => {
    // Nearly any code!
}

delegate (param) {
    // Nearly any code!
}

param => JustASingleExpression (No switches)

私もチェックしました:-)

[Test]
public void SwitchInLambda()
{
    TakeALambda(i => {
        switch (i)
        {
            case 2:
                return "Smurf";
            default:
                return "Gnurf";
        }
    });
}

public void TakeALambda(Func<int, string> func)
{
    System.Diagnostics.Debug.WriteLine(func(2));
}

正常に動作します(出力&quot; Smurf&quot;)!

ここに画像の説明を入力してください

私はこれを学びました:

                      (model) =>
                                {
                                    switch(model.SentInvoiceTypeId)
                                    {
                                        case 1:
                                            return "1 asdf";
                                        case 2:
                                            return "2 asdf";
                                        case 3:
                                            return "3 asdf ";
                                        case 4:
                                            return "4 asdf ";
                                        default:
                                            return "asdf";
                                    }
                                }

「モデル」の間に置くだけ(){}にコードを追加します。忘れないようにしてください。
どのバージョンのC#が機能するかわかりません。この例ではC#7.0です

この回答が誰かを助けることを願っています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top