.NET 4.0框架中是否已存在以下通用方法?

时间:2010-10-20 00:00:35

标签: c# .net visual-studio-2010 .net-4.0 c#-4.0

.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 。另外,我正在寻找一种查询语法解决方案。请不要将表达式转换为流畅的语法,从而轻视它。

4 个答案:

答案 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#类型推断踢它并使它不那么难看。