C# 以下通用方法是否已存在于.NET 4.0框架中?
以下通用函数是否存在于.NET4.0框架中的任何位置?如果确实如此,我希望重用它,而不是自己编写:C# 以下通用方法是否已存在于.NET 4.0框架中?,c#,.net,visual-studio-2010,.net-4.0,c#-4.0,C#,.net,Visual Studio 2010,.net 4.0,C# 4.0,以下通用函数是否存在于.NET4.0框架中的任何位置?如果确实如此,我希望重用它,而不是自己编写: public static class Lambda { public static U Wrap<U>(Func<U> f) { return f(); } } 更新:对于所有质疑此解决方案的人,请查看Onkelborg的答案,了解在不使用lambda.Wrap()的情况下包含lambda需要什么(同时仍保持查询语法)。请不要消除lam
public static class Lambda
{
public static U Wrap<U>(Func<U> f)
{
return f();
}
}
更新:对于所有质疑此解决方案的人,请查看Onkelborg的答案,了解在不使用lambda.Wrap()的情况下包含lambda需要什么(同时仍保持查询语法)。请不要消除lambda。这必须适用于abitrary(值返回)lambdas。另外,我只是在寻找一个查询语法解决方案。请不要将表达式转换为流畅的语法,从而使其变得平凡。根据Reflector,该方法不存在。但我不明白你为什么需要它:)
string test=“12,23,34,23,12”;
var res=来自test.Split(',')中的字符串s
选择((Func)(()=>{stringu=s+s;返回int.Parse(u);}));
我认为这将是完全相同的事情根据Reflector,该方法不存在。但我不明白你为什么需要它:)
string test=“12,23,34,23,12”;
var res=来自test.Split(',')中的字符串s
选择((Func)(()=>{stringu=s+s;返回int.Parse(u);}));
我想这完全是一回事这和
var res = test.Split(',').Select(s => {
var u = s + s;
return int.Parse(u);
});
?
是的,它编译并运行。这与
var res = test.Split(',').Select(s => {
var u = s + s;
return int.Parse(u);
});
?
是的,这将编译并运行。您可以在代码中使用
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); });
问题更新后:
我不是故意不尊重你,但我认为这个解决方案是没有必要的
这里有一点探索:
如果我们想像你说的那样接受真正“任意”的lambda,那么它们可以来自外部源,Wrap
什么也不做,因为它与f()
相同:
但是如果您这样做,f
不能以任何方式依赖于s
(例如,这样您就不能编写示例代码):
我们真正想要的是s
上的任意闭包。要实现这一点,lambda必须内联定义,其中s
在范围内,因此您不再真正接受真正的“任意”lambda,它们必须直接写入代码中
这就是为什么我提出了let
语法,因为您可以提出的任何lambda都可以转换为该语法,它与查询语法的其余部分一起使用。这就是let
的设计目的!:)
或者,您可以只使用lambda,它接受上面的f2
之类的参数
如果您真的想坚持lambda语法,我建议您使用扩展方法。正如我在评论中所说,看起来您正在寻找介于查询和扩展语法之间的某种东西
我想知道为什么要将lambda语法与查询语法一起使用
希望这有帮助:)您可以在代码中使用
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); });
问题更新后:
我不是故意不尊重你,但我认为这个解决方案是没有必要的
这里有一点探索:
如果我们想像你说的那样接受真正“任意”的lambda,那么它们可以来自外部源,Wrap
什么也不做,因为它与f()
相同:
但是如果您这样做,f
不能以任何方式依赖于s
(例如,这样您就不能编写示例代码):
我们真正想要的是s
上的任意闭包。要实现这一点,lambda必须内联定义,其中s
在范围内,因此您不再真正接受真正的“任意”lambda,它们必须直接写入代码中
这就是为什么我提出了let
语法,因为您可以提出的任何lambda都可以转换为该语法,它与查询语法的其余部分一起使用。这就是let
的设计目的!:)
或者,您可以只使用lambda,它接受上面的f2
之类的参数
如果您真的想坚持lambda语法,我建议您使用扩展方法。正如我在评论中所说,看起来您正在寻找介于查询和扩展语法之间的某种东西
我想知道为什么要将lambda语法与查询语法一起使用
希望这有帮助:)不,它不存在。Onkelborg的解决方案是开箱即用的最佳解决方案,因此,如果您真的想在LINQ表达式中执行任意代码块,那么我将编写您建议的
Wrap
函数,以便让C#类型推断生效并使其不那么难看。不,它不存在。Onkelborg的解决方案是开箱即用的最佳解决方案,因此,如果您真的想在LINQ表达式中执行任意代码块,那么我将编写您建议的Wrap
函数,以使C#类型推断生效,并使其不那么难看。您是否尝试过在没有显式转换为Func的情况下编译它?否,我没有试过编译任何东西。但是由于你的代理返回了一个int,我认为没有理由+1来检查reflector并生成一个更短的解决方案。好吧,我应该投票给-1,因为它不编译,并且是无效的C#代码,但我不会,因为我是问题的作者。嗯,为什么它不编译?也许,您可能需要执行(()=>{stringu=s+s;返回int.Parse(u);})。Will test Now你有没有试过在没有对Func进行显式转换的情况下编译它?没有,我没有试过编译任何东西。但由于您的代理返回int,我认为没有理由+1来检查reflector并生成
// 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