Tot*_*oto 17 c# lambda expression-trees switch-statement
是否有可能在lambda表达式中进行切换?如果没有,为什么?Resharper将其显示为错误.
Jon*_*eet 22
你可以在一个语句块lambda:
Action<int> action = x =>
{
switch(x)
{
case 0: Console.WriteLine("0"); break;
default: Console.WriteLine("Not 0"); break;
}
};
Run Code Online (Sandbox Code Playgroud)
但你不能在"单表达式lambda"中这样做,所以这是无效的:
// This won't work
Expression<Func<int, int>> action = x =>
switch(x)
{
case 0: return 0;
default: return x + 1;
};
Run Code Online (Sandbox Code Playgroud)
这意味着你不能在表达式树中使用switch(至少由C#编译器生成;我相信.NET 4.0至少在库中支持它).
Mar*_*ell 10
在纯粹的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...
Run Code Online (Sandbox Code Playgroud)
没有乐趣,特别是当它变得复杂时.如果你的意思是带有语句体的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";
}
};
Run Code Online (Sandbox Code Playgroud)
当然,你可以将工作外包出去; 例如,LINQ-to-SQL允许您将标量UDF(在数据库中)映射到数据上下文中的方法(实际上未使用) - 例如:
var qry = from cust in ctx.Customers
select new {cust.Name, CustomerType = ctx.MapType(cust.TypeFlag) };
Run Code Online (Sandbox Code Playgroud)
哪个MapType是在数据库服务器上完成工作的UDF.
是的,它可以工作,但你必须将你的代码放在一个块中.例:
private bool DoSomething(Func<string, bool> callback)
{
return callback("FOO");
}
Run Code Online (Sandbox Code Playgroud)
然后,打电话给它:
DoSomething(val =>
{
switch (val)
{
case "Foo":
return true;
default:
return false;
}
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
15748 次 |
| 最近记录: |