C#高级编程之Lambda表达式
C#的Lambda表达式,如果你第一接触这个专业术语,听这个名字你完全不知道它是干嘛的。那问题就来了(放心不是去蓝翔学挖掘机)。
它到底是什么呢?
说明这个问题需要借助代码,给予简单描述。代码如下:
publicdelegateintdeleArgu(intx);//委托//...//...inty=0;mydeleArgu=x=>{returnx*x;};//这就是一个Lambda表达式。y=mydeleArgu(5);//结果y=25;
由上面所看到的x=>{return x*x};这就是一个Lambda表达式,它其实就是一个匿名函数。那接下来的问题就出现了。
2.什么是匿名函数?
我也是借用几行代码说明,代码如下:
publicdelegateintdeleArgu(intx);//委托mydeleArgu=delegate(intx){returnx*x;};Console.WriteLine(mydeleArgu(5));//输出为25;
上面的代码中mydeleArgu = delegate(int x){return x*x;};这就是一个匿名函数。这个事在.Net FrameWork 2.0后加入的概念。在.Net FrameWork 1.0的委托是把指针指向一个函数,那么名字叫什么,阿猫阿狗都无所谓了,名字不再重要,所以在这个地方提供了匿名方法。
3.Lambda表达式是怎么来的?
到了后来.Net Framework 3.5之后就更加的改进了,如下代码:
publicdelegateStringdeleTransfer(strings);deleTransfer=s=>s.Substring(0,1).toUpper()+s.Substring(1).toLower();//首字母大写,其他小写Console.WriteLine(deleTransfer("abdDEF"));//结果"Adbef"
上面的部分就是带一个参数的Lambda表达式。是不是感觉它就是一个匿名方法?没错!它就是这样的。
我们很快就看清Lambda表达式的发展脉络,它是委托和匿名方法过渡而来的,和匿名方法很相似。
总结:(来自官方文档)
=>运算符具有与赋值运算符 (=) 相同的优先级并且是右结合运算(参见“运算符”文章的“结合性”部分)。
Lambda 在基于方法的 LINQ 查询中用作标准查询运算符方法(如Where)的参数。
使用基于方法的语法在Enumerable类中调用Where方法时(如在 LINQ to Objects 和 LINQ to XML 中一样),参数是委托类型System.Func<T, TResult>。使用 Lambda 表达式创建该委托最为方便。例如,当你在System.Linq.Queryable类中调用相同的方法时(如在 LINQ to SQL 中一样),参数类型为System.Linq.Expressions.Expression<Func>,其中 Func 是最多具有十六个输入参数的任何一个 Func 委托。同样,Lambda 表达式只是一种非常简洁的构造该表达式目录树的方式。尽管事实上通过 Lambda 创建的对象具有不同的类型,但 Lambda 使得Where调用看起来类似。
在上一个示例中,请注意委托签名具有一个int类型的隐式类型输入参数,并返回int。可以将 Lambda 表达式转换为该类型的委托,因为该表达式也具有一个输入参数 (x),以及一个编译器可隐式转换为int类型的返回值。(以下几节中将对类型推理进行详细讨论。)使用输入参数 5 调用委托时,它将返回结果 25。在is或as运算符的左侧不允许使用 Lambda。适用于匿名方法的所有限制也适用于 Lambda 表达式
表达式位于 => 运算符右侧的 lambda 表达式称为“表达式 lambda”。表达式 lambda 广泛用于表达式树(C# 和 Visual Basic)的构造。表达式 lambda 会返回表达式的结果,并采用以下基本形式:
(input parameters) => expression;
语句 lambda 与表达式 lambda 表达式类似,只是语句括在大括号中:
(input parameters) => {statement;};
更多信息查询官方文档。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。