C#基础:Lambda表达式

从委托的角度来看,Lambda表达式与匿名方法没有区别。在【C#基础:匿名方法】一文中,我使用了匿名方法来调用List<T>的FindAll方法。从C# 3.0开始,在使用匿名方法的地方,完全可以用Lambda表达式来代替。Lambda表达式的定义方式为:“([参数列表]) => 表达式”。运算符“=>”是一种与赋值运算“=”具有相同优先级的右结合运算符,在英语里读作:“goes to”。

现在回过头来看我们的例子。下面的代码与【C#基础:匿名方法】一文中的代码具有相同的效果:

view plaincopy to clipboardprint?
  1. class Program   
  2. {   
  3.     static void Main(string[] args)   
  4.     {   
  5.         List<string> names = new List<string>();   
  6.         names.Add("Sunny Chen");   
  7.         names.Add("Kitty Wang");   
  8.         names.Add("Sunny Crystal");   
  9.   
  10.         List<string> found = names.FindAll   
  11.             (   
  12.             // Lambda Expression Implementation   
  13.             name => name.StartsWith(   
  14.                 "sunny",    
  15.                 StringComparison.OrdinalIgnoreCase)   
  16.             );   
  17.   
  18.         if (found != null)   
  19.         {   
  20.             foreach (string str in found)   
  21.                 Console.WriteLine(str);   
  22.         }   
  23.     }   
  24. }   

上面的Lambda Expression Implementation在效果上与匿名方法没有任何区别,“=>”左边的name定义了参数(当参数个数为1的时候,圆括号可以省略),“=>”右边定义执行体。由于C# 3.0编译器具有Type Inference的能力,参数类型与返回值都将由编译器通过上下文判定,因此与匿名方法不同,Lambda表达式的参数可以不给定参数类型。当所表示的匿名方法没有任何参数时,Lambda表达式也同样可以使用,只需在“=>”左边用一对圆括号表示即可。即:

view plaincopy to clipboardprint?
  1. () => Console.WriteLine("Hello!");   

事实上,“Lambda表达式”这一词比较笼统,事实上“=>”运算符既可以表示Lambda表达式,也可以表示Lambda语句。Lambda语句由代码块组成,形式上很像匿名方法。请看下面的例子:

view plaincopy to clipboardprint?
  1. class Program   
  2. {   
  3.     static void Main(string[] args)   
  4.     {   
  5.         // Lambda 表达式   
  6.         Func<intbool> dele1 = n => n > 10;   
  7.         // Lambda 语句   
  8.         Func<intbool> dele2 = (int n) => { return n > 10; };   
  9.         Console.WriteLine(dele1(16));   
  10.         Console.WriteLine(dele1(8));   
  11.     }   
  12. }   

两种定义方法同样可以正确地输出结果。请注意,当我们希望构建表达式树的时候,情况却完全不同了:

view plaincopy to clipboardprint?
  1. // ok   
  2. Expression<Func<intbool>> expr1 = n => n > 10;   
  3. // error: cannot converted to an expression tree   
  4. Expression<Func<intbool>> expr2 = (int n) => { return n > 10; };   

由此可见,在构建表达式树的时候,不能用Lambda语句(带有代码语句的Lambda表达式),而应该使用Lambda表达式。从这里就可以看出匿名方法与Lambda表达式的区别了。

有关委托的高级话题以及表达式树的内容,我会在后面的文章中继续研究。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/466369.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TQ210 —— 点亮LED

TQ210 —— 点亮LED 1、S5PV210 GPIO硬件简介 1.1、GPIO 【S5PV210有237个多功能IO口&#xff0c;通过设置寄存器确定某个引脚用于输入输出或者其他特殊功能】 GPIO的英文全称为General-PurposeIO ports&#xff0c;也就是通用IO接口。在嵌入式系统中常常有数量众多&#xff0…

bind1nd\bind2nd

https://www.cnblogs.com/renyuan/p/6216375.html https://blog.csdn.net/jnu_simba/article/details/9530341

拆解镍氢电池充电器,简单的电路设计令人震惊!

上班爱摸鱼&#xff0c;下班爱钓鱼&#xff0c;于是买了一个钓鱼机。不贵&#xff0c;几十块钱&#xff0c;带4条鱼竿。长这样&#xff1a;电池驱动&#xff0c;钓起鱼来乐趣无穷&#xff1a;惊喜的是&#xff0c;钓鱼机自带附赠的电池是可充电的&#xff0c;省下不少买干电池的…

设备底座几个常见固定方式

在运营商我们可以经常发现如下的固定方式&#xff0c;因为设备厂家的不同&#xff0c;以及机房上下走线方式&#xff0c;固定方式也有些差异。可以清楚看见&#xff0c;底座可以靠螺母进行微调使机柜高度&#xff0c;底部还有膨胀螺丝打入地板还有很多机柜是不加微调用的底座&a…

抽35块树莓派新品单片机送给可爱的你们

我是谁~公众号「嵌入式Linux」&#xff0c;深入解析简明扼要直白解释各种技术问题&#xff0c;包括但不局限于Linux、单片机、半导体、Android、C语言等等。号主从事嵌入式软件行业有10余年&#xff0c;建立了10余个技术微信群&#xff0c;整理了很多技术资料&#xff0c;欢迎大…

bitset类

C语言的一个类库&#xff0c;用来方便地管理一系列的bit位而不用程序员自己来写代码。 bitset除了可以访问指定下标的bit位以外&#xff0c;还可以把它们作为一个整数来进行某些统计。 可以如下声明一个该类型变量&#xff1a; bitsetvarm (M) 其中varm为变量名。 N表示该类型在…

TQ210——时钟系统

TQ210——时钟系统 1、时钟域 一般来讲&#xff0c; MCU 的主时钟来源主要是外部晶振或外部时钟&#xff0c;比较常见的是 外 部晶振。一般情况&#xff0c;系统内所使用的时钟都是高频率的时钟&#xff0c;外部晶振一般达不到那么高的频率&#xff0c;所以一般使用锁相环电路&…

Android 监听耳机的插拔事件

一般采用的是动态监听的方式来实现的&#xff1a; package com.renhui.ej;import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.Bundle; import android.supp…

ubuntu操作

下面的命令大都需要在控制台 / 终端 / shell 下输入。 控制台, 终端, 和 shell 意味着同样一件事 - 一个命令行界面&#xff0c; 他可以用来控 制系统。 打开一个控制台: 应用程序 --> 附件 --> 终端 任何一个使用 sudo 作为前缀的命令都需要拥有管理员 (或 root) 访问权…

我的文章汇总

2018年文章汇总2019年文章汇总2020年文章汇总专辑|Linux文章汇总专辑|程序人生专辑|C语言专辑|Git专辑|安卓系统专辑|嵌入式我的知识小密圈关注公众号&#xff0c;后台回复「1024」获取学习资料网盘链接。欢迎点赞&#xff0c;关注&#xff0c;转发&#xff0c;在看&#xff0c…

CMap

https://blog.csdn.net/u010879420/article/details/53914767

webpack-安装

以前配置的gulpfile.js&#xff0c;随着版本的迭代更新&#xff0c;现在已经... 1.安装webpack npm i -g webpack-cli && npm i -g babel-preset-env 2.弹射出窗口&#xff08;我们未安装Git&#xff0c;或者未找到Git path&#xff0c;请配置path&#xff09; 3.再次执…

TQ210——S5PV210中断体系

TQ210——S5PV210中断体系 中断是指 CPU 在执行程序的过程中&#xff0c;遇到异常情况需要处理&#xff0c; CPU停 止当前程序的运行&#xff0c;保存当前程序运行处的必要参数&#xff0c;转去处理这些异常情况&#xff0c; 处理结束后再返回当前程序的间断处&#xff0c;继续…

高通骁龙888开始被Linux内核5.12版正式支持

在Linux 5.12内核合并窗口中&#xff0c;有很多新的硬件开始被支持&#xff0c;其中不乏一些知名产品例如高通骁龙888&#xff0c;除此之外还有一些与ARM平台和设备树有关的代码添加。来自Arnd Bergmann的各种内核拉取请求在周六晚上被合并&#xff0c;此前由于恶劣的冬季风暴阻…

NOD32: 教育网、公网超级 病毒更新服务器

NOD32:教育网超级 病毒更新服务器: http://222.197.166.33/main.htm公网香港代理 服务器&#xff1a;proxy.nod32.com.hk, 端口&#xff1a;8888转载于:https://www.cnblogs.com/stoneresearch/archive/2008/11/26/4336751.html

CLabel

https://blog.csdn.net/alexander_china/article/details/9943559 https://blog.csdn.net/stawn/article/details/10133095

Python实现比较两个列表(list)范围

Python实现比较两个列表(list)范围 有一道题&#xff1a; 比较两个列表范围&#xff0c;如果包含的话&#xff0c;返回TRUE&#xff0c;否则FALSE。 详细题目如下&#xff1a; Create a function, this function receives two lists as parameters, each list indicates a scop…

单片机里面的CPU使用率是什么鬼?

打开电脑的任务管理器&#xff0c;看着跳动的CPU使用率&#xff0c;发现很舒服。每一个线程占用了多少CPU清清楚楚&#xff0c;也就能针对性的确认为啥你的电脑跑的慢了。今天这篇笔记不讲每个任务&#xff08;或线程&#xff09;CPU的使用情况&#xff0c;而是单片机整体的CPU…

TQ210——按键(中断查询法)

TQ210——按键 底板上有8个独立按键&#xff0c;可分别使用查询法和中断法控制按键。通过原理图可知&#xff1a;按键按下&#xff0c;GPIO检测到低电平&#xff0c;松开时高电平。 直接查询法程序的实现简单&#xff0c;但是效率很低&#xff0c;CPU一直在查询&#xff0c;啥事…

CPropertySheet 与CPropertyPage 的基本使用

https://www.cnblogs.com/sylar-liang/p/4173015.html https://blog.csdn.net/qq_18297675/article/details/51229028 怎么创建 CPropertyPage 是一个从CDialog派生而来的一个类&#xff0c;基本功能与对话框类一样&#xff0c; CPropertySheet不是一个CDialog的派生类&#x…