什么是Lambda 表达式?

    "Lambda表达式"实际上是一个方法,只不过该方法是一个匿名方法(就是没有名字的方法(函数),就是说只有在定义的时候能调用,在其他地方就不能调用了),是一种高效的类似于函数式编程的表达式,  (@高效 : 只在一个地方用用完就不用了,没必要单独写一个方法) 所有Lambda表达式都使用Lambda运算符 =>; ,该运算符读作"goes to"。该标记在 lambda 表达式中用来将左侧的输入变量与右侧的 lambda 体分离。 Lambda 表达式是与匿名方法类似的内联表达式,但更加灵活;在以方法语法表示的 LINQ 查询中广泛使用了 Lambda 表达式。

  注:带 @ 为个人查资料理解。

Lambda 预备知识

   1 . Enumerable 类

    说明 :提供一组用于查询实现 System.Collections.Generic.IEnumerable<T>(泛型集合) 的对象的 static方法。

我们平常最常用Lambda的地方是对集合的操作。所以我们要首先简要列举一下此类以及常用方法,在使用中详细介绍。

     Where :  基于谓词筛选值序列。

      Select  : 将序列中的每个元素投影到新表中

     SelectMany : 将序列的每个元素投影到 IEnumerable<T> 并将结果序列合并为一个序列。

     Single<TSource> : 返回序列的唯一元素;如果该序列并非恰好包含一个元素,则会引发异常.

     Skip<TSource> : 跳过序列中指定数量的元素,然后返回剩余的元素。

     SkipWhile<TSource> : 只要满足指定的条件,就跳过序列中的元素,然后返回剩余元素。

     Sum : 计算 Int32 值序列之和。

     Take<TSource> : 从序列的开头返回指定数量的连续元素。

     TakeWhile<TSource> : 只要满足指定的条件,就会返回序列的元素。

     。。。。。。。。。。。

  2 . Func<T, TResult>

    由于上面介绍的方法中很多都涉及到一个参数Func<TSource,TResult>. 鉴于很多小伙伴不太理解这个(我也不太理解),咱就一起探讨下。

    Func<T,TR> 定义 :封装一个具有一个参数并返回 TResult 参数指定的类型值的方法。

    这个函数是一个委托(引用类型) public delegate TResult Func<in T, out TResult>(T arg); 共有17个重载

        in T

        此委托封装的方法的参数类型。

     out TResult

        此委托封装的方法的返回值类型。

 class Class1{Func<string, string> fc = new Func<string, string>(GetName);public void WriteName(){fc.Invoke("吐鲁番");}public static string GetName(string s){return s;}}

看一下我们平时用的Where方法 Where<TSource>(IEnumerable<TSource>, Func<TSource, Boolean>)
   List<User> userLists = new List<User>() {new User(){ Name = "罗生天" ,PassWord="123456"}, new User(){ Name = "吉祥天" ,PassWord="123456"}, new User(){ Name = "灵宝天" ,PassWord="123456"}, new User(){ Name = "红尘天" ,PassWord="123456"}, new User(){ Name = "魔刹天" ,PassWord="123456"}, }; var user = userLists.Where(p => p.Name=="罗生天"); var user2 = userLists.Where(delegate(User p) { return p.Name == "罗生天"; }); 

为什么我们平时传参传的是lambda表达式呢 看下面这个例子:
先看下这条语句  Func<int, bool> d = x => x == 10 ? true : false ; 为什么 可以写成这种形式呢 ? 
  答: 请注意委托签名具有一个 int 类型的隐式类型输入参数,并返回bool。可以将 Lambda 表达式转换为该类型的委托,因为该表达式也具有一个输入参数 (x),以及一个编译器可隐式转换为 bool 类型的返回值。(百度百科)。
这就是我们平时为什么这样写了

Lambda使用注意事项

    在 is 或 as 运算符的左侧不允许使用 Lambda。

适用于匿名方法的所有限制也适用于 Lambda 表达式。有关更多信息,请参见匿名方法(C# 编程指南)。
特殊
    下列规则适用于 Lambda 表达式中的变量范围:捕获的变量将不会被作为垃圾回收,直至引用变量的委托超出范围为止。
在外部方法中看不到 Lambda 表达式内引入的变量。
Lambda 表达式无法从封闭方法中直接捕获 ref 或 out 参数。
Lambda 表达式中的返回语句不会导致封闭方法返回。
Lambda 表达式不能包含其目标位于所包含匿名函数主体外部或内部的 goto 语句、break 语句或 continue 语句。
Lambda表达式的本质是“匿名方法”,即当编译我们的程序代码时,“编译器”会自动将“Lambda表达式”转换为“匿名方法”,如下例:
    string[] names={"agen","balen","coure","apple"};string[] findNameA=Array.FindAll<string>(names,delegate(string v){return v.StartsWith("a");});string[] findNameB=Array.FindAll<string>(names,v=>v.StartsWith("a"));

    上面中两个FindAll方法的反编译代码如下:  

    string[]findNameA=Array.FindAll<string>(names,delegate(stringv){returnv.StartsWith("a");});string[]findNameB=Array.FindAll<string>(names,delegate(stringv){returnv.StartsWith("a");});

从而可以知道“Lambda表达式”与“匿名方法”是可以划上等号的,只不过使用“Lambda表达式”输写代码看上去更直观漂亮,不是吗?

Lambda表达式使用

1. 输入参数 ( "=>"运算符 左边 )和表达式或语句块( "=>"运算符 右边 )  

输入参数 即 " => " 左边部分 。它包含的参数数量可以 为0 ,1 或者多个。当输入参数个数 是1 时 ,表达式左边的小括号 可以省略 ,其他必须加括号 。

   输入参数 数量 大于或者等于 2 时,表达式 左边的小括号 用 "," 分开

(x, y) => x == y

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

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

  没有参数

() => SomeMethod()

2. 与Enumerable 类 结合使用

 List<User> userLists = new List<User>() {new User(){ Name = "罗生天" ,PassWord="123456"},new User(){ Name = "吉祥天" ,PassWord="123456"},new User(){ Name = "灵宝天" ,PassWord="123456"},new User(){ Name = "红尘天" ,PassWord="123456"},new User(){ Name = "魔刹天" ,PassWord="123456"},new User(){ Name = "清虚天" ,PassWord="123456"},};

(1)Where方法   Func<TSource, Boolean>用于测试每个元素是否满足条件的函数,返回值是bool类型。 相当于 if (x > y) 即筛选条件 ;

Where<TSource>(IEnumerable<TSource>, Func<TSource, Boolean>)

var user = userLists.Where(p => p.Name=="罗生天");

这种写法是 当调用Where方法时TSource已经确定 返回值也已经确定IEnumerable<User> 。(?)

Where<TSource>(IEnumerable<TSource>, Func<TSource, Int32, Boolean>)

var otherUser = userLists.Where<User>((p,m) => p.Name.Length > m);

第二个参数为该元素的索引。

 (2) Select方法 将序列中的每个元素投影到新表中。与Where一样有两个重载 第二个参数 是索引。通俗来说就是 把集合中的元素 的某些属性 拿出来 。

Select<TSource, TResult>(IEnumerable<TSource>, Func<TSource, TResult>)

      List<string> strs = new List<string>() { "12","2adfs","3456"};var caste =  strs.Select<string,string>(st =>{if (st.Length > 2)st = "123";return st;});

View Code

           var names = userLists.Select(p => p.Name); // 取每个元素中的 "Name" 返回值为IEnumerable<string>var newList = userLists.Select(p => new Student(){Name = p.Name,Grade =Convert.ToInt32( p.PassWord)});  // 得到新类型的集合 此时的返回值为IEnumerable<Student>

(3)TakeWhile 实例  与Where 不同点是 当找到匹配的元素时就会返回  一个 IEnumerable<T>,包含输入序列中出现在测试不再能够通过的元素   (未匹配)之前的元素。

string[] fruits = { "apple", "banana", "mango", "orange", "passionfruit", "grape" };IEnumerable<string> query =fruits.TakeWhile(fruit => String.Compare("orange", fruit, true) != 0);foreach (string fruit in query){Console.WriteLine(fruit);}/*This code produces the following output:applebananamango*/

暂时先到这了 最常用的也就是Where跟Select了。 虽然还有好多东西没介绍不过大概都差不多。大家可以自己多了解下其他的 ,第一次写博客 文章难免会有漏洞 或者不对的地方 ,希望大家能指出来 一起讨论 一起学习 ,一起进步 。祝大家早日 升职加薪, 当上总经理, 出任CEO, 迎娶白富美, 走上人生巅峰。

  

转载于:https://www.cnblogs.com/kunlunmountain/p/4480097.html

C# Lambda表达式 基础相关推荐

  1. Java基础-Lambda表达式基础练习

    Lambda表达式基础练习 Lambda表达式得格式:(形式参数)->{代码块} Lambda表达式使用前提: 有一个接口 接口中有且仅有一个抽象方法 练习1:定义一个接口(Eatable),里 ...

  2. Java 8 Lambda表达式基础语法

    /*** * 一.Lambda 表达式的基础语法:* Java8中引入了要给新的操作符 "->" 该操作符称作箭头操作符 或 Lambda操作符* 箭头操作符将Lambda拆 ...

  3. 100天精通Python(基础篇)——第26天:lambda表达式基础+代码实战

    文章目录 一.lambda函数介绍 二.lambda函数与 def 函数的区别 三.lambda函数案例 3.1 定义加法函数 3.2 使用if判断奇偶性 3.3 无参数表达式 3.4 列表排序 3. ...

  4. Lambda表达式的基础知识(一)

    Lambda表达式简介: 一.什么是Lambda表达式? Lambda表达式也被称为箭头函数.匿名函数.闭包 Lambda表达式提现的是轻量级函数式编程思想 '->' 符号是Lambda表达式核 ...

  5. java compare 返回值_关于Java你不知道的那些事之Java8新特性[Lambda表达式和函数式接口]...

    前言 为什么要用Lambda表达式? Lambda是一个匿名函数,我们可以把Lambda表达式理解为是一段可以传递的代码,将代码像数据一样传递,这样可以写出更简洁.更灵活的代码,作为一个更紧凑的代码风 ...

  6. 五十八、Java8的新特性Lambda表达式

    @Author:Runsen @Date:2020/6/24 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏 ...

  7. java8 ie_Java8语法糖之Lambda表达式_Hudie.的博客-CSDN博客

    原文作者:编程一只蝶 原文标题:Java8语法糖之Lambda表达式 发布时间:2021-02-16 13:08:40 一.Lambda表达式简介 Lambda表达式,是Java8的一个新特性,也是J ...

  8. lambda表达式最全总结

    lambda表达式 一.lambda表达式的引入 为什么引入lambda表达式 需求环境:线程类的创建 解决方案:匿名内部类实现 解决方案PLUS:lambda表达式实现 代码: package co ...

  9. Lambda表达式语法及应用

    前言: JDK8后,源码中开始应用Lambda表达式,所以如果想读懂源码的同学学习它是绕不过去的,至于lambda表达式在不在开发中使用,就要看自己的需求啦,他的优点很明显,简洁,非常容易并行计算,提 ...

最新文章

  1. UTF-8 带签名和不带签名的区别
  2. Qt中多线程与界面组件的通信
  3. CentOS中Jenkins的下载、安装、配置与启动(图文教程)
  4. Linux之CentOS的PHP为7.2但显示5.4版本
  5. iPhone的mysql客户端_适用于iPhone的MySQL C API库
  6. dos命令 cd命令使用说明[图文说明]
  7. 【资源下载】921页《用Python3带你从小白入门机器学习实战》教程手册
  8. java 中关键字_java中关键字一览
  9. asp.net优化方案
  10. webpack ,require.ensure配合oclazyload 实现ng1模块懒加载
  11. LX04 小米触屏音箱刷机教程
  12. Flash cs4 for mac 序列号。
  13. Kindle Fire 刷机至Android 4.2.2
  14. FlashBuilder使用
  15. html图像缩小失真,图像放大和缩小不失真的方法!
  16. 深度半监督学习方法总结
  17. ibm tivoli_使用Tivoli®Composite Application Manager监视Tivoli®Access Manager WebSEAL服务器事务以进行响应时间跟踪
  18. 利用Django创建简单app
  19. 程序员如何快速上手一个自己不太熟悉的新项目
  20. 隧道二衬钢筋(一键生成)

热门文章

  1. [Qt教程] 第15篇 2D绘图(五)绘制图片
  2. mysql 链接慢_mysql连接非常慢的觖决办法及其它常见问题解决办法
  3. Git/Github--push自己的第一段代码
  4. 每天一道LeetCode-----计算n的阶乘末尾有多少个0
  5. 每天一道LeetCode-----比较两个字符串,每个字符串被若干'.'分成多个数字,一个个比较
  6. 1005 继续(3n+1)猜想 (25 分)(c语言实现)
  7. vscode could not establish connection to linux The VS Code Server failed to start
  8. 搜索旋转排序数组—leetcode31
  9. bat 发邮件与手机交互_售价17500元!华为首款5G折叠屏手机来了,更多新机细节曝光...
  10. 第十章 PX4-Pixhawk-姿态控制