概述

   Lambda 表达式的本质就是匿名函数。(而匿名方法的本质是委托

   “Lambda 表达式”是一个匿名函数,可以包含表达式和语句,并且可用于创建委托或表达式树类型。 (Lambda 表达式的运算符为 =>,读作“goes to”。=> 运算符具有与赋值运算符(=)相同的优先级)

  Lambda 的基本形式是:

    (input parameters) => expression

    只有在 Lambda 有一个输入参数时,括号才是可选的,否则括号是必需的。

    两个或更多输入参数由括在括号中的逗号分隔: (x, y) => x==y 。

  有时,编译器难于或无法推断输入类型。如果出现这种情况,您可以按以下示例中所示的方式显式指定类型:

    (int x, string s) => s.Length > x

  使用空括号指定零个输入参数:

    () => SomeMethod()

  最常用的场景是 IEnumerable 和 IQueryable 接口的 Where(c => c.Id > 3)

下列规则适用于 Lambda 表达式中的变量范围:

    捕获的变量将不会被作为垃圾回收,直至引用变量的委托超出范围为止。

    在外部方法中看不到 Lambda 表达式内引入的变量。

    Lambda 表达式无法从封闭方法中直接捕获 ref 或 out 参数。

    Lambda 表达式中的返回语句不会导致封闭方法返回。

    Lambda 表达式不能包含其目标位于所包含匿名函数主体外部或内部的 goto 语句、break 语句或 continue 语句。

Lambda 表达式缩写推演

            new Func<string, int>(delegate (string str) { return str.Length; });
delegate (string str) { return str.Length; }    //匿名方法
(string str) => { return str.Length; }   //Lambda语句
(string str) => str.Length          //Lambda表达式
(str) => str.Length        //让编译器推断参数类型
str => str.Length        //去掉不必要的括号

应用实例

  一、

    delegate int AddDel(int a, int b);      //定义一个委托(与类同级)

        #region
        AddDel fun = delegate (int a, int b) { return a + b; }; //匿名函数
        AddDel funLambda = (a, b) => a + b; //lambda本质就是匿名函数(lambda参数类型可以进行隐式推断,可以省略类型)
        //Console.WriteLine(fun(1, 3));         List<string> strs = new List<string>() { "", "", "" };
        var temp = strs.FindAll(s => int.Parse(s) > );         foreach(var item in temp)
        {
          Console.WriteLine(item);
        }
        //Console.WriteLine(funLambda(1, 3));
        #endregion

  二、

        static bool GetEvenNum(int num)
{
if(num % == )
{
return true;
}
return false;
} List<int> nums = new List<int>() { , , , , , , }; //使用委托方式
List<int> evenNums = nums.FindAll(GetEvenNum);
foreach(var item in evenNums)
{
Console.WriteLine(item);
} Console.WriteLine("使用 lambda 的方式");
List<int> evenNumLambda = nums.FindAll(n => n % == );
foreach (var item in evenNumLambda)
{
Console.WriteLine(item);
}
Console.ReadKey();

C# 3.0 / C# 3.5 Lambda 表达式的更多相关文章

  1. C#3.0之神奇的Lambda表达式和Lambda语句

    “Lambda 表达式”是一个匿名函数,它可以包含表达式和语句,并且可用于创建委托或表达式目录树类型.所有 Lambda 表达式都使用 Lambda 运算符 =>,该运算符读为“goes to” ...

  2. C#3.0新增功能08 Lambda 表达式

    连载目录    [已更新最新开发文章,点击查看详细] Lambda 表达式是作为对象处理的代码块(表达式或语句块). 它可作为参数传递给方法,也可通过方法调用返回. Lambda 表达式广泛用于: 将 ...

  3. C#中的Lambda表达式和表达式树

    在C# 2.0中,通过方法组转换和匿名方法,使委托的实现得到了极大的简化.但是,匿名方法仍然有些臃肿,而且当代码中充满了匿名方法的时候,可读性可能就会受到影响.C# 3.0中出现的Lambda表达式在 ...

  4. Lambda表达式的前世今生

    Lambda 表达式 早在 C# 1.0 时,C#中就引入了委托(delegate)类型的概念.通过使用这个类型,我们可以将函数作为参数进行传递.在某种意义上,委托可理解为一种托管的强类型的函数指针. ...

  5. Lambda表达式和表达式树

    在C# 2.0中,通过方法组转换和匿名方法,使委托的实现得到了极大的简化.但是,匿名方法仍然有些臃肿,而且当代码中充满了匿名方法的时候,可读性可能就会受到影响.C# 3.0中出现的Lambda表达式在 ...

  6. 十二、C# 委托与Lambda表达式(匿名方法的另一种写法)

    委托与Lambda表达式   1.委托概述 2.匿名方法 3.语句Lambda 4.表达式Lambda 5.表达式树   一.委托概述 相当于C++当中的方法指针,在C#中使用delegate 委托来 ...

  7. Lambda表达式 - 浅谈

    概述: 只要有委托参数类型的地方,就可以使用 Lambda表达式.在讲述Lambda表达式之前,有必要先简要说明一下 委托中的"匿名方法": using System; using ...

  8. Lambda表达式的面纱(一)

    在.NET3.0版本中微软推出了Lambda表达式.这使代码的表述可以更加优雅.但是对于新事物大多会本能的排斥,虽然3.0版本已经推出了好久了,但是我向周围的人了解了一下,用Lambda的人不是很多, ...

  9. C#之lambda表达式

    从C#3.0开始,可以使用lambda表达式把实现代码赋予委托.lambda表达式与委托(http://www.cnblogs.com/afei-24/p/6762442.html)直接相关.当参数是 ...

随机推荐

  1. Latex: 减少图与文字之间的空白间隙

    参考: Remove space after figure and before text Latex: 减少图与文字之间的空白间隙 论文中图与文字之间的空白间隙过大,导致排版不大美观.解决方法是在\ ...

  2. Paper Reviews and Presentations

    Copied from Advanced Computer Networks, Johns Hopkins University. Paper Reviews and Presentations Ea ...

  3. Android四种布局方式

    线性布局 <LinearLayout android:layout_width="match_parent" android:layout_height="wrap ...

  4. BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊(分块)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2002 题意: 思路:不会LCT,就只好用分块了. 将这n个数分成根号n块,对于每一块中的每一个数,处 ...

  5. java根据URL获取HTML内容

    之前我写脚本,是想获取HTML内容的. 但是呢...一方面编码困扰着我,于是我写了这个: java根据URL获取网页编码 然后呢,每个网站是不是GZIP还得判断,贼麻烦... 但是没办法啊,麻烦也得写 ...

  6. 浅谈 equals 和 == 的区别

    在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String("hello"); 2 String str2 = new String(&qu ...

  7. velocity.js 动画插件

    1. velocity.js 插件介绍 Velocity 是独立于jQuery的,但两者可以结合使用的动画插件.用法类似 jq 的 animate ,但是支持更高级动画. ( 颜色动画.转换动画(tr ...

  8. Android 虹软免费人脸识别App

    人脸识别+本机Web后端 人脸sdk采用虹软sdk,本机web采用AndServer:上传姓名+人脸图片即可实现注册源码地址:https://github.com/joetang1989/ArcFac ...

  9. tf一些函数

    1. tf.reduce_mean(a) : 求平均值 2. tf.truncated_normal([3,2],stddev=0.1) : 从正态分布中输出随机值,标准差为0,1,构造矩阵为3*2的 ...

  10. Qt网络应用开发初步

      应用层的网络协议,如HTTP/FTP/SMTP等简称"应用协议",他们运行在TCP/UDP之上,从Qt5开始,已经不再分别提供QHttp类,QFtp类,应用层的编程使用QNet ...