Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 以下通用方法是否已存在于.NET 4.0框架中?_C#_.net_Visual Studio 2010_.net 4.0_C# 4.0 - Fatal编程技术网

C# 以下通用方法是否已存在于.NET 4.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

以下通用函数是否存在于.NET4.0框架中的任何位置?如果确实如此,我希望重用它,而不是自己编写:

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