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表达式解剖的更多相关文章

  1. Linq快速入门——Lambda表达式的前世今生

    Linq快速入门——Lambda表达式的前世今生   Lambda表达式其实并不陌生,他的前生就是匿名函数,所以要谈Lambda表达式,就不得不谈匿名函数,要谈匿名函数,那又要不得不谈委托. 何为委托 ...

  2. Java基础教程:Lambda表达式

    Java基础教程:Lambda表达式 本文部分内容引用自OneAPM:http://blog.oneapm.com/apm-tech/226.html 引入Lambda Java 是一流的面向对象语言 ...

  3. C++实现委托机制(三)——lambda表达式封装

    C++.引言:              其实原本没打算写这一章的,不过最后想了想,嗯还是把lambda表达式也一并封装进去,让这个委托也适应lambda表达式的注册.不过在之前还是需要先了解lamb ...

  4. 关于Linq中的Lambda表达式中OrderBy的深入理解

    起因:就是一段Linq语句,OrderBy里面的i是什么? IQueryable<Student> slist = (from s in EFDB.Student select s). O ...

  5. Linq To Sql中实现Left Join与Inner Join使用Linq语法与lambda表达式

    当前有两个表,sgroup与sgroupuser,两者通过gKey关联,而sgroup表记录的是组,而sgroupuser记录是组中的用户,因此在sgroupuser中不一定有数据.需要使用Left ...

  6. Linq专题之Lambda表达式

    这一节我们讲的Lambda表达式跟匿名函数有关.Lambda表达式就是一个匿名函数,它可以包含表达式和语句,并且可以创建委托和表达式树. Lambda表达式的组成: 输入参数.Lambda运算符(=& ...

  7. Java基础教程(23)--lambda表达式

    一.初识lambda表达式 1.定义   lambda表达式是一个可传递的代码块,或者更确切地说,可以把lambda表达式理解为简洁地表示可传递的匿名方法的一种方式.它没有名称,但它有参数列表.函数主 ...

  8. 三 lambda表达式有什么用

    (转载: https://mp.weixin.qq.com/s/-PHOc6p-qKJBktle28AUgA) 一: 直接把代码块赋值给变量 我们知道,对于一个Java变量,我们可以赋给其一个“值”. ...

  9. LINQ和Lambda表达式

    前言 前段时间接触了一种新的表达式,但是不知道这个是什么意思,所以就先站在巨人的肩膀用了,现在听师哥说这种写法是Lambda表达式.我一直以为,这个Lambda表达式和LINQ查询有异曲同工之妙,可惜 ...

随机推荐

  1. RHEL7 -- 修改主机名

    RHEL7中,有三种定义的主机名: a.静态的(static):“静态”主机名也称为内核主机名,是系统在启动时从/etc/hostname自动初始化的主机名 b.瞬态的(transient):“瞬态” ...

  2. Android github上开源项目、酷炫的交互动画和视觉效果地址集合

    Android上开源的酷炫的交互动画和视觉效果:http://blog.csdn.net/u013278099/article/details/50323689 Awesome-android-ui: ...

  3. PowerDesigner列名作为注释

    Tools -> Execute Commands -> Edit/Run Script 执行以下脚本: Option Explicit ValidationMode = True Int ...

  4. Linux下安装配置Redis

    一 下载并安装 (1)下载: [root@localhost src]# wget http://download.redis.io/releases/redis-3.2.5.tar.gz (2)安装 ...

  5. RhinoMock学习-绑定回调

    Expect.Call(testClass.Test(new Arg())) .IgnoreArguments() .Return() .Callback(); return true; })); . ...

  6. [na]那些OVER的封装(pppoe/ppp/ipsec)

    什么over什么,如pppoe, ppp的封装都在over对象之后,入下图: PPPOE Ipsec

  7. 翻翻git之---效果鲜明的类ViewPager库 ConvenientBanner(对图片载入部分进行改动)

    转载请注明出处:王亟亟的大牛之路 昨天写了篇基础的View绘制的内容貌似观众老爷们不怎么喜欢.那再这里再安利下自己定义View时.用到Paint Canvas的一些温故.讲讲用路径绘画实现动画效果(基 ...

  8. Very very important SQL Server article

    https://support.microsoft.com/en-us/kb/2964518

  9. 超详细解说Hadoop伪分布式搭建--实战验证【转】

    超详细解说Hadoop伪分布式搭建 原文http://www.tuicool.com/articles/NBvMv2原原文 http://wojiaobaoshanyinong.iteye.com/b ...

  10. 判断IP是否为爬虫IP

    方法一: 通过国外网站验证:http://bot.myip.ms/123.125.71.12 返回结果: IP/Domain - 123.125.71.12:   Baidu Bot on this ...