.NET 4.0框架中的任何位置都存在以下泛型函数吗?我想重复使用它,而不是自己编写它:
public static class Lambda
{
public static U Wrap<U>(Func<U> f)
{
return f();
}
}
它允许以下构造(即嵌入在LINQ查询的select子句中的lambda表达式):
string test="12,23,34,23,12";
var res=from string s in test.Split(',')
select Lambda.Wrap(() => {string u=s+s; return int.Parse(u);});
更新:对于质疑此解决方案的所有人,请查看Onkelborg的答案,了解如何在没有Lambda.Wrap()的情况下包含lambda(同时仍保持查询语法)。请不要消除lambda。这必须适用于 abitrary(值返回)lambdas 。另外,我正在寻找一种查询语法解决方案。请不要将表达式转换为流畅的语法,从而轻视它。
答案 0 :(得分:6)
您可以在代码中使用let
语法:
string test = "12,23,34,23,12";
var res = from string s in test.Split(',')
let u = s+s
select int.Parse(u);
或者,您可以直接使用LINQ扩展方法而不是特殊语法:
string test = "12,23,34,23,12";
var res = test.Split(',')
.Select(s => { var u = s + s; return int.Parse(u); });
自问题更新后:
我不是故意不尊重,但我认为这个解决方案没有必要。
这是一个探索:
如果我们想要像你说的那样接受真正的“任意”lambdas,那么它们可能来自外部来源,Wrap
什么都不做,因为它与f()
相同:
// with 'f' as some arbitrary lambda, then this:
var res = from string s in test.Split(',')
select f.Wrap();
// is the same as:
var res = from string s in test.Split(',')
select f();
但是如果你这样做,f
不能以任何方式依赖s
(例如,这样你就不能编写你的示例代码):
// e.g. where does s come from?
var f = () => { var u = s+s; return int.Parse(u); };
// we can write it like this, as a function of 's':
var f2 = s => { var u = s+s; return int.Parse(u); };
//but then you can just use "select f2(s)" and we're back not needing Wrap any more
我们真正需要的是s
上的任意闭包。为此,lambda必须内联定义,s
在范围内,所以你不再真正接受真正的“任意”lambdas,而且必须直接在代码中编写。 / p>
这就是我提出let
语法的原因,因为你可以提出的任何lambda都可以转换为该语法,并且它与查询语法的其余部分一起使用。这就是let
的目的! :)
或者,你可以使用带有f2
之类参数的lambdas。
如果你真的想坚持使用lambda语法,我建议使用扩展方法。就像我在评论中说的那样,看起来你正在寻找查询和放大器之间的东西。扩展语法。
我有兴趣为什么要将lambda语法与查询语法一起使用?
希望这会有所帮助:)
答案 1 :(得分:1)
这与
有什么不同var res = test.Split(',').Select(s => {
var u = s + s;
return int.Parse(u);
});
是的,这会编译并运行。
答案 2 :(得分:0)
根据Reflector,该方法不存在。但我不明白你为什么需要它:)
string test = "12,23,34,23,12";
var res = from string s in test.Split(',')
select ((Func<int>)(() => { string u = s + s; return int.Parse(u); }))();
我认为这将是完全相同的事情
答案 3 :(得分:0)
不,它不存在。 Onkelborg的解决方案是您可以开箱即用的最佳解决方案,因此如果您确实想在LINQ表达式中执行任意代码块,那么我将创建您建议的Wrap
函数以获得C#类型推断踢它并使它不那么难看。