C#的Lambda表达式,如果你第一接触这个专业术语,听这个名字你完全不知道它是干嘛的。那问题就来了(放心不是去蓝翔学挖掘机)。
它到底是什么呢?
说明这个问题需要借助代码,给予简单描述。代码如下:
public delegate int deleArgu(int x);//委托 //... //... int y = 0; mydeleArgu=x=>{return x*x;};//这就是一个Lambda表达式。 y=mydeleArgu(5);//结果y=25;
由上面所看到的x=>{return x*x};这就是一个Lambda表达式,它其实就是一个匿名函数。那接下来的问题就出现了。
2.什么是匿名函数?
我也是借用几行代码说明,代码如下:
public delegate int deleArgu(int x);//委托 mydeleArgu = delegate(int x){return x*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之后就更加的改进了,如下代码:
public delegate String deleTransfer(string s); 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;};
更多信息查询官方文档。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。