C#3.0(.NET3.5)中引入了Lambda表达式和LINQ。Lambda表达式是使用一些特殊语法表示匿名方法的较短方法。
最基本的Lambda表达式语法如下:
(参数列表)=>{方法体}
说明:
1、参数列表中的参数类型可以是明确类型或者推断类型。
2、如果是推断类型,则参数的数据类型将由编辑器根据上下文自动推断出来。
让我们看看Lambda表达式是如何从匿名方法演变而来的。
相关示例:
delegate(int item) { return item % == ; };
1、Lambda表达式从匿名方法演变,首先删除delegate关键字和参数类型并添加Lambda运算符=>,演变后的代码如下:
(item)=>{return item % == ;};
2、如果我们只有一个返回值的语句,那么我们不需要花括号、返回和分号,所以我们可以去掉这些符号,演变后的代码如下:
(item)=>item % == 0;
3、如果我们只有一个参数,我们也可以删除(),代码如下:
item=>item % == 0;
因此,我们得到如下所示的Lambda表达式:
item => item % 2 == 0
其中item是参数,=>是Lambda运算符,item % 2 == 0是正文表达式。
二、具有多个参数的Lambda表达式
如果需要传递多个参数,那么必须将参数括在括号内,如下所示:
(ints, item) => ints.Contains(item);
如果不想使用推断类型,那么可以给出每个参数的类型,如下所示:
(int[] ints, int item) => ints.Contains(item)
三、不带任何参数的Lambda表达式
在Lambda表达式中可以没有参数,如下所示:
() => Console.WriteLine("这是一个不带任何参数的Lambda表达式");
四、正文表达式中有多条语句
在前面讲过,如果正文表达式有一个语句,那么可以去掉方法体外面的大括号。如果正文表达式中有多条语句,那么必须用大括号将正文表达式括起来,如下所示:
(ints, item) =>
{
Console.WriteLine("这是包含多条语句的Lambda表达式");
return ints.Contains(item);
};
五、表达式中的局部变量
你可以在表达式的主体中声明一个变量,以便在表达式主体的任何位置使用它,如下所示:
ints =>
{
int item = ;
return ints.Contains(item);
};
六、Lambda表达式中的内置泛型委托
1、Func委托
当你想从lambda表达式返回一些东西时,使用Func <> delegate。
其中T是输入参数的类型,TResult是返回类型。
示例代码如下:
Func<int[], bool> isContains = p => p.Equals();
int[] ints = { , , , , , , , };
bool isEquals = isContains(ints);
在上面的例子中,Func委托期望第一个输入参数是int[]类型,返回类型是boolean。Lambda表达式是p => p.Equals(10)。
2、Action委托
与Func委托不同,Action委托只能有输入参数。 当不需要从lambda表达式返回任何值时,请使用Action委托类型。
示例代码如下:
Action<int[]> PrintItem = p =>
{
foreach (int item in p)
{
Console.WriteLine(item);
}
};
int[] ints = { , , , , , , , };
PrintItem(ints);
七、在LINQ中使用Lambda表达式
通常情况下,Lambda表达式与LINQ查询一起使用。枚举静态类包括接受Func <TSource,bool>的IEnumerable <T>的Where扩展方法。IEnumerable <Int>集合的Where()扩展方法需要传递Func <Student,bool>,如下所示:
现在,您可以将分配给Func委托的lambda表达式传递给方法语法中的Where()扩展方法,如下所示:
Func<int, bool> isContains = p =>p.Equals ();
int[] ints = { , , , , , , , };
var result = ints.Where(isContains).ToList();
八、Lambda表达式要点总结
1、Lambda表达式是一种表示匿名方法的更短的方法。
2、Lambda表达式语法:parameters =>正文表达式
3、Lambda表达式可以在()中具有零个或多个参数。
4、Lambda表达式可以在大括号{}中的正文表达式中有一条或多条语句。
5、Lambda表达式可以分配给Func,Action或Predicate委托。
6、Lambda表达式可以以类似的方式调用委托。
LINQ教程三:Lambda表达式解剖的更多相关文章
-
Linq快速入门——Lambda表达式的前世今生
Linq快速入门——Lambda表达式的前世今生 Lambda表达式其实并不陌生,他的前生就是匿名函数,所以要谈Lambda表达式,就不得不谈匿名函数,要谈匿名函数,那又要不得不谈委托. 何为委托 ...
-
Java基础教程:Lambda表达式
Java基础教程:Lambda表达式 本文部分内容引用自OneAPM:http://blog.oneapm.com/apm-tech/226.html 引入Lambda Java 是一流的面向对象语言 ...
-
C++实现委托机制(三)——lambda表达式封装
C++.引言: 其实原本没打算写这一章的,不过最后想了想,嗯还是把lambda表达式也一并封装进去,让这个委托也适应lambda表达式的注册.不过在之前还是需要先了解lamb ...
-
关于Linq中的Lambda表达式中OrderBy的深入理解
起因:就是一段Linq语句,OrderBy里面的i是什么? IQueryable<Student> slist = (from s in EFDB.Student select s). O ...
-
Linq To Sql中实现Left Join与Inner Join使用Linq语法与lambda表达式
当前有两个表,sgroup与sgroupuser,两者通过gKey关联,而sgroup表记录的是组,而sgroupuser记录是组中的用户,因此在sgroupuser中不一定有数据.需要使用Left ...
-
Linq专题之Lambda表达式
这一节我们讲的Lambda表达式跟匿名函数有关.Lambda表达式就是一个匿名函数,它可以包含表达式和语句,并且可以创建委托和表达式树. Lambda表达式的组成: 输入参数.Lambda运算符(=& ...
-
Java基础教程(23)--lambda表达式
一.初识lambda表达式 1.定义 lambda表达式是一个可传递的代码块,或者更确切地说,可以把lambda表达式理解为简洁地表示可传递的匿名方法的一种方式.它没有名称,但它有参数列表.函数主 ...
-
三 lambda表达式有什么用
(转载: https://mp.weixin.qq.com/s/-PHOc6p-qKJBktle28AUgA) 一: 直接把代码块赋值给变量 我们知道,对于一个Java变量,我们可以赋给其一个“值”. ...
-
LINQ和Lambda表达式
前言 前段时间接触了一种新的表达式,但是不知道这个是什么意思,所以就先站在巨人的肩膀用了,现在听师哥说这种写法是Lambda表达式.我一直以为,这个Lambda表达式和LINQ查询有异曲同工之妙,可惜 ...
随机推荐
-
ndk学习19: 使用Eclipse调试so
1. 设置调试选项 在AndroidManifest文件加入允许调试 android:debuggable="true" 此时编译项目会多出: 2. 配置调试代码 把需要调 ...
-
python之6-5偏函数
functools.partial 偏函数的作用是简化操作,简化什么操作呢?就是当我们有一个已知函数A,且这个函数包含有某个或多个参数A1,通过固定这个参数A1,我们可以自己编写一个新函数B,来减少代 ...
-
win8.1镜像制作
使用自带的powerShell工具,以管理员身份运行,比如镜像的目标位置为F盘,那么用下面的命令即可, wbAdmin start backup -backupTarget:F: -include:C ...
-
Apache Rewrite 理解
因为工作须要,查了一下Apache的文档,对当中反向引用和条件的运行做了理解和实验,以下是对Apache 2.2文档的摘录,并在上面做了实验的样例说明,希望能给一些须要深入理解的一些帮助. 其它部分就 ...
-
centos7下安装docker(12.1bridge网络)
容器默认使用的时bridge网络 docker安装时会创建一个 命令为docker0的linux bridge.如果不指定--network=,运行的容器会默认挂到docker0上 interface ...
-
百练-16年9月推免-C题-图像旋转
C:图像旋转 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 输入一个n行m列的黑白图像,将它顺时针旋转90度后输出. 输入 第一行包含两个整数n和m,表示图 ...
-
在JSP中,使用get提交方式出现乱码时,为什么要使用new String(s.getBytes(";iso-8859-1";),";utf-8";);?
最近在学JSP,在学习处理get方式提交数据出现乱码问题的时候,对其中的一个解决方法new String(s.getBytes("iso-8859-1"),"utf-8& ...
-
vue 时间戳转 YYYY-MM-DD h:m:s
export default function(data = 1){ let myDate; if(data !== 1){ myDate = new Date(data * 1000); }else ...
-
C# W3 调试
如果在调试附加进程中 没W3进程的话, 在运行里输入 uac 设置为从不通知 即可:
-
AUTOIT3设置用户包含目录