C# Lambda表达式详解,及Lambda表达式树的创建

  每次写博客,第一句话都是这样的:程序员很苦逼,除了会写程序,还得会写博客!当然,希望将来的一天,某位老板看到此博客,给你的程序员职工加点薪资吧!因为程序员的世界除了苦逼就是沉默。我眼中的程序员大多都不爱说话,默默承受着编程的巨大压力,除了技术上的交流外,他们不愿意也不擅长和别人交流,更不乐意任何人走进他们的内心!

   题外话说多了,咱进入正题:

   上一节中,我们讲到:在 2.0 之前的 C# 版本中,声明委托的唯一方法是使用命名方法。  C# 2.0 引入了匿名方法,而在 C# 3.0 及更高版本中,Lambda 表达式取代了匿名方法,作为编写内联代码的首选方式。  有一种情况下,匿名方法提供了 Lambda 表达式中所没有的功能。  您可使用匿名方法来忽略参数列表。  这意味着匿名方法可转换为具有各种签名的委托。  这对于 Lambda 表达式来说是不可能的。  有关 lambda 表达式的更多特定信息,请参见 Lambda 表达式(C# 编程指南)。 

1、表达式Lambda

  表达式位于 => 运算符右侧的 lambda 表达式称为“表达式 lambda”。 表达式 lambda 会返回表达式的结果,并采用以下基本形式:

 (input parameters) => expression

仅当 lambda 只有一个输入参数时,括号才是可选的;否则括号是必需的。 括号内的两个或更多输入参数使用逗号加以分隔:

(x, y) => x == y

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

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

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

1() => SomeMethod() 2 32、语句Lambda当lambda表达式中,有多个语句时,写成如下形式: 4 5(input parameters) => {statement;} 6 7例如: 8 9delegate void TestDelegate(string s);…TestDelegate myDel = n => { string s = n + " " + "World"; Console.WriteLine(s); };myDel("Hello");

  使用举例:

List<string> Citys = new List<string>()   {    "BeiJing",    "ShangHai",    "Tianjin",    "GuangDong"   };   var result1 = Citys.First(c => c.Length > 7);   Console.WriteLine(result1);   var result2 = Citys.Where(c => c.Length > 7);   foreach(var r in result2)   {    Console.WriteLine(r);   }   Console.ReadKey();

  

这个是大家熟悉的LINQ语句,如果没学过没关系,这里用的只是很简单的几个方法,相信大家都能看懂。

首先定义一个Citys集合,初始化有一些数据。然后调用LINQ的first方法,查询出来长度大于7的第一个结果,看到了吧,这里用的就是Lambda表达式,

如果我们自己写,还要写循环遍历集合,然后判断字符串长度是否大于7,起码要写四五行代码,而这里只要一行就够了,而且LINQ也要写很长。

这里用的是最简单的Lambda表达式,(input parameters) => expression的形式。

下面来看一下,如何自己定义和使用Lambda表达式,首先写下面一个函数:

public void LambdaFun(string str,Func<string,string> func)  {   Console.WriteLine(func(str));  }

  这里用到了Func<T>委托,不懂的可以去百度查资料,这个方法什么都没有做,只是调用了委托方法,并将参数传递过去,下面来看一下使用方法:

LambdaFun("BeiJing 2013", s =>   {   if (s.Contains("2013"))   {    s = s.Replace("2013", "2014");   }   return s;   });

这里将传入字符串中的2013替换成为2014,当然还可以是将其他字符串替换城任何内容,或者是截取,连接等等,完全由我们传入的Lambda表达式决定,到了这里感觉到Lambda表达式的强大了吧。

    总结下红色那段话的意思:微软告诉你:我们在C#2.0之前就有委托了,在2.0之后又引入了匿名方法,C#3.0之后,又引入了Lambda表达式,他们三者之间的顺序是:委托->匿名变量->Lambda表达式,微软的一步步升级,带给我们编程上的优美,简洁,可读性强.....在此,不多夸微软,怕他们看到这篇博客后骄傲,怕他们尾巴能翘到天上,不知天高地厚。嘿嘿,说多了!

    温故而知新,可以做老师,咱们来温故下委托和匿名表达式。

委托如下:

delegate int calculator(int x, int y); //委托类型  static void Main()  {   calculator cal = new calculator(Adding);   int He = cal(1, 1);   Console.Write(He);  }  /// <summary>  /// 加法  /// </summary>  /// <param name="x"></param>  /// <param name="y"></param>  /// <returns></returns>  public static int Adding(int x, int y)  {   return x + y;  }

  匿名方法如下:

.........
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )