ラムダ式のC#スイッチ
-
07-07-2019 - |
質問
ラムダ式にスイッチを入れることは可能ですか?そうでない場合、なぜですか? 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;)!
所属していません StackOverflow