.net 向新手解释Lambda表达式语法的好资源?

.net 向新手解释Lambda表达式语法的好资源?,.net,linq,lambda,.net,Linq,Lambda,Lambda表达式似乎是新加入.NET的人的常见绊脚石。有人有好的资源向新手解释吗?lambda只是一种匿名方法,如下所示: delegate(string parm1, int parm2) { // ... } lambda的第一部分用于方法参数。如果没有参数,或参数不止一个,则需要括号: // no parameters () => null // one parameter x => null // multiple parameters (x, y, z) =

Lambda表达式似乎是新加入.NET的人的常见绊脚石。有人有好的资源向新手解释吗?

lambda只是一种匿名方法,如下所示:

delegate(string parm1, int parm2)
{
    // ...
}
lambda的第一部分用于方法参数。如果没有参数,或参数不止一个,则需要括号:

// no parameters
() => null

// one parameter
x => null

// multiple parameters
(x, y, z) => null
将写入与上述匿名方法对应的lambda:

(string parm1, int parm2) => ...
根据lambda的使用方式,编译器实际上可以推断参数的类型和返回值,因此它们并不总是必需的

lambda的最后一部分用于方法体

delegate(string parm1, int parm2)
{
    return string.Format("{0}{1}", parm1, parm2);
}

(parm1, parm2) =>
{
    return string.Format("{0}{1}", parm1, parm2);
}
如果方法主体是单行,lambda不需要return关键字,也不需要大括号:

(parm1, parm2) => string.Format("{0}{1}", parm1, parm2);

这些是基础。我希望这有帮助。

lambda只是一种匿名方法,如下所示:

delegate(string parm1, int parm2)
{
    // ...
}
lambda的第一部分用于方法参数。如果没有参数,或参数不止一个,则需要括号:

// no parameters
() => null

// one parameter
x => null

// multiple parameters
(x, y, z) => null
将写入与上述匿名方法对应的lambda:

(string parm1, int parm2) => ...
根据lambda的使用方式,编译器实际上可以推断参数的类型和返回值,因此它们并不总是必需的

lambda的最后一部分用于方法体

delegate(string parm1, int parm2)
{
    return string.Format("{0}{1}", parm1, parm2);
}

(parm1, parm2) =>
{
    return string.Format("{0}{1}", parm1, parm2);
}
如果方法主体是单行,lambda不需要return关键字,也不需要大括号:

(parm1, parm2) => string.Format("{0}{1}", parm1, parm2);


这些是基础。我希望这有帮助。

你是新手吗?我能成为源头吗?是吗?我也不认为lambda表达式本身是特定于.net的,它们是函数式编程的正常部分。更重要的是,lambda表达式不是.net的一部分,它们是.net中某些语言的一部分,CLR对它们没有概念。@PhillipSchmidt我猜他不是新手,因为他刚刚在他的博客上发布了一个详细解释它们的链接。“赛尔夫?”“是的,赛尔夫。”“我有一个问题。”“太好了,赛尔夫。我对你的问题有一个答案!”丹·洛尔公平地说,在他发布之前我问了这个问题:P不应该使用SO来发布一个问题,这样你就可以回答了。你是新手吗?我能成为源头吗?是吗?我也不认为lambda表达式本身是特定于.net的,它们是函数式编程的正常部分。更重要的是,lambda表达式不是.net的一部分,它们是.net中某些语言的一部分,CLR对它们没有概念。@PhillipSchmidt我猜他不是新手,因为他刚刚在他的博客上发布了一个详细解释它们的链接。“赛尔夫?”“是的,赛尔夫。”“我有一个问题。”“太好了,赛尔夫。我对你的问题有一个答案!”丹·洛尔公平地说,在他发布之前,我问了这个问题:PNot适当地使用SO来发布一个问题,只是为了让你能够回答它。Lambda不是匿名方法。Lambda可以被视为匿名方法,但是,例如,所有
Queryable
扩展都不使用匿名(或任何其他)方法,但仍然可以从lamdba中获益匪浅。我不同意你说Lambda不是匿名方法。在.Net中,它们是。C#编译器以同样的方式将lambdas和匿名方法编译成IL。在.Net中,lambda是用匿名方法实现的。这里你错了。而
可枚举。其中(source,a=>a.Name==”)
具有类型为
Func
的第二个参数,该参数是委托,将生成匿名方法
Queryable。其中(source,a=>a.Name==”)
具有类型为
Expression
的第二个参数,因此不是委托,也不会生成方法,但是表达式树,以后可由
QueryableProvider
使用。这就是实体框架、Linq2Sql等的工作方式。顺便说一句,这就是为什么
var f=b=>b.Name==”无法编译。如果lambdas是代理,那么表达式的类型很容易推断。根据我的经验,这是唯一需要解释的事情。其他的都是语法糖。正如这篇文章的两个答案所显示的,区分语法和实现以及委托和表达式是非常重要的。Lambda不是匿名方法。Lambda可以被视为匿名方法,但是,例如,所有
Queryable
扩展都不使用匿名(或任何其他)方法,但仍然可以从lamdba中获益匪浅。我不同意你说Lambda不是匿名方法。在.Net中,它们是。C#编译器以同样的方式将lambdas和匿名方法编译成IL。在.Net中,lambda是用匿名方法实现的。这里你错了。而
可枚举。其中(source,a=>a.Name==”)
具有类型为
Func
的第二个参数,该参数是委托,将生成匿名方法
Queryable。其中(source,a=>a.Name==”)
具有类型为
Expression
的第二个参数,因此不是委托,也不会生成方法,但是表达式树,以后可由
QueryableProvider
使用。这就是实体框架、Linq2Sql等的工作方式。顺便说一句,这就是为什么
var f=b=>b.Name==”无法编译。如果lambdas是代理,那么表达式的类型很容易推断。根据我的经验,这是唯一需要解释的事情。其他的都是语法糖。正如这篇文章的两个答案所显示的,区分语法和实现以及委托和表达式是非常重要的。