匿名方法与Lambda表达式
1.匿名方法
在学习委托时,我们知道委托实例至少要绑定一个方法才能使用,而调用委托实际上是调用了它所关联地方法。一般来说,需要定义一个与委托签名相符的方法,并使之与委托变量关联。如以下代码:
Action deleg=new Action(CallMethod);//声明并实例化委托变量
private static void CallMethod()//与委托关联的方法
{.........}
会发现以上写法并不简洁,因此引入了“匿名方法”,它不需要命名,用一个delegate关键字代表方法的名字,没有访问修饰符,也不需要返回类型。
例如上面的例子可以简写如下:
Action deleg=delegate()
{........};
当委托既有参数又有返回值的时候,匿名方法中就也要相应定义参数,如果委托的签名中有返回值,则在匿名方法中就直接使用return返回即可,如下实例:
Func<int,int,int> f=delegate(int x,int y)
{ return x+y;};
int result=f(1+2);//调用委托
其实上例所用的委托的原型如下:delegate TResult Func<in T1,in T2,out TResult>(T1 x,T2 y);
如果委托要关联地方法在代码中没有重复使用,使用匿名方法会非常方便,当方法在代码中多个地方都用到,就不应该在使用匿名方法。
2.Lambda表达式
Lambda表达式其实就是更为简洁的匿名方法表示法,以“=>”作为分隔符,其左边为匿名方法的参数列表,右边为匿名方法的语句,即:(参数列表)=><语句>
对于没有参数的委托,Lambda表达式如下:()=><语句>
2.1 Lambda表达式用于给委托变量赋值
(1)对于没有参数,返回值为void类型的委托
Action a=()=>{/*........*/};
如果“=>”右边只有一句代码,则可以省略大括号,写出:Action a=()=>Console.WriteLine("");
(2)对于有参数的委托
Action<string,int> a=(string name,int age)=>Console.WriteLine("");
由于Lambda表达式可以根据委托来识别参数类型,所以可以省略(string name,int age)中的参数类型。
(3)对于有返回值的委托(非void类型),则直接用return 返回即可。
Func<int,int ,int> a=(a,b)=>{return a*b;};
如果“=>”后边只有一句代码,可以吧return和大括号省略,如下所示:
Func<double, string> a=(n)=>n.ToString("C2");
2.2 Lambda表达式用于参数传递
比如.NET类库的许多扩展方法以及LINQ表达式都可以使用Lambda表达式传递参数。示例代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace Test
{
#region 定义类型
public class Student
{
public string Name { get; set; }
public int Age { get; set; }
public DateTime Date { get; set; }
}
#endregion class Program
{
static void Main(string[] args)
{
List<Student> stus = new List<Student>();
stus.Add(new Student { Name = "小王", Age = , Date = new DateTime(, , ) });
stus.Add(new Student { Name = "小刘", Age = , Date = new DateTime(, , ) });
stus.Add(new Student { Name = "小红", Age = , Date = new DateTime(, , ) }); // 将学员的入学日期按升序排序
var res = stus.OrderBy(stu => stu.Date);
Console.WriteLine("学员的入学日期按升序排序:");
foreach (Student s in res)
{
Console.WriteLine("姓名:{0},年龄:{1},入学日期:{2:yyyy-M-d}", s.Name, s.Age, s.Date);
}
Console.ReadKey();
}
}
}
以上代码使用了OrderBy扩展方法的以下重载:
public static IOrderedEnumerble<TSource> OrderBy<TSource,TKey>(this IEnumerble<TSource> source,Func<TSource,TKey> keySelector);
在调用时,主要关注keySelector参数,因为第一个参数是要扩展的类型,由编译器调用。keySelector参数是Func<TSource,TKey>,输入类型为TSource,TKey是要返回的值,OrderBy方法将根据TKey来进行排序。实例中,stu会自动识别为Student类型,“=>”右边直接将stu的Date属性值返回,OrderBy方法通过调用传递给keySelector参数的委托来获取每个Student实例的Date属性值,以便进行排序。
匿名方法与Lambda表达式的更多相关文章
- 从匿名方法到 Lambda 表达式的推演过程
Lambda 表达式是一种可用于创建委托或表达式目录树类型的匿名函数. 通过使用 lambda 表达式,可以写入可作为参数传递或作为函数调用值返回的本地函数. 以上是msdn官网对Lambda 表达式 ...
- 委托学习笔记后续:泛型委托及委托中所涉及到匿名方法、Lambda表达式
引言: 最初学习c#时,感觉委托.事件这块很难,其中在学习的过程中还写了一篇学习笔记:委托.事件学习笔记.今天重新温故委托.事件,并且把最近学习到和委托相关的匿名方法.Lambda表达式及泛型委托记录 ...
- C# 从CIL代码了解委托,匿名方法,Lambda 表达式和闭包本质
前言 C# 3.0 引入了 Lambda 表达式,程序员们很快就开始习惯并爱上这种简洁并极具表达力的函数式编程特性. 本着知其然,还要知其所以然的学习态度,笔者不禁想到了几个问题. (1)匿名函数(匿 ...
- 委托、匿名方法、Lambda表达式的演进
摘自:"http://www.cnblogs.com/eagle1986/archive/2012/01/19/2327358.html 假设给我们一个泛型对象List<T>,T ...
- 匿名方法,Lambda表达式,高阶函数
原文:匿名方法,Lambda表达式,高阶函数 匿名方法 c#2.0引入匿名方法,不必创建单独的方法,因此减少了所需的编码系统开销. 常用于将委托和匿名方法关联,例如1. 使用委托和方法关联: this ...
- Fun<>,匿名方法,Lambda表达式 冒泡排序C#
大头文 分享,进步 冒泡排序C#实现,使用委托,包括三种方式:Fun<>,匿名方法,Lambda表达式 冒泡排序是一种简单的排序方法,适合于小量数字排序,对于大量数字(超过10个),还有更 ...
- 泛型委托及委托中所涉及到匿名方法、Lambda表达式
泛型委托及委托中所涉及到匿名方法.Lambda表达式 引言: 最初学习c#时,感觉委托.事件这块很难,其中在学习的过程中还写了一篇学习笔记:委托.事件学习笔记.今天重新温故委托.事件,并且把最近学习到 ...
- .NET Framework System.Array.Sort 数组类,加深对 IComparer、IComparable 以及泛型委托、匿名方法、Lambda 表达式的理解
本文内容 自定义类 Array.Sort 参考资料 System.Array.Sort 有很多对集合的操作,比如排序,查找,克隆等等,你可以利用这个类加深对 IComparer.IComparable ...
- C#中分别对委托、匿名方法、Lambda表达式、Lambda表达式树以及反射执行同一方法的过程进行比较。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- 进阶系列(8)——匿名方法与lambda表达式
一 匿名方法的介绍 匿名方法是为了简化委托的实现,方便调用委托方法而出现的,同时,匿名方法也是学好lambda表达式的基础.在委托调用的方法中,如果方法只被调用一次,这个时候我们就没有必要创建 ...
随机推荐
- Thrift-0.9.2编译安装
确定安装好了boost1.54以上 确定libevent版本大于1.0 只编译生成cpp库 ./configure --without-java --without-lua --without-pyt ...
- 如何让PowerShell显示中文不乱码
故障描述: 这两天有个部门做了个Survey用来调查一些信息,由于对最后的结果报表有些特殊要求,不得不决定弃用SharePoint Survey自带的Export to spreadsheet功能,改 ...
- Android知识杂记(四)
1.完整退出activity的设计思路 1.1 封装一个基础activity类 public abstract class RootActivity extends FragmentActivity{ ...
- Mint Linux 安装 DotnetCore 遭遇无法修正错误,因为您要求某些软件包保持现状,就是它们破坏了软件包间的依赖关系
evlon@evlon-ThinkPad-T530 ~ $ apt install dotnet-dev-1.0.0-preview2-003121 正在读取软件包列表... 完成 正在分析软件包的依 ...
- Html5 实现灯笼绘制
最近在学习Html5,就用JavaScript在Canvas试着绘制了一个灯笼,并作了简要的说明. 具体绘制思路在页面上有说明,不再赘述,代码如下: <script type="tex ...
- Service基础使用
Service基础使用 之前的文章一直介绍Activity的使用,很多知识和用法单一的配合Activity使用,这次将总结Android四大组件之二--Service. 本文将要介绍以下内容: Ser ...
- ESP8266刷AT固件与nodemcu固件
这回是使用的这一款 因为这款默认的是支持AT指令的固件,,所以我们就刷nodemcu的 先看接线 GPIO0 默认是工作模式(不接线).如果接了低电平就是下载模式(给模块刷固件!!)所以接低电平.CH ...
- Chrome开发者工具不完全指南:(三、性能篇)
卤煮在前面已经向大家介绍了Chrome开发者工具的一些功能面板,其中包括Elements.Network.Resources基础功能部分和Sources进阶功能部分,对于一般的网站项目来说,其实就是需 ...
- Hibernate框架的配置
概念 持久化框架 把对象保存到数据库中,对数据的CURD操作 配置Hibernate 1.在项目中引入Hibernate的Jar包 在 WebContent/WEB-INF/lib 目录下 导入jar ...
- 进程管理三大扩展工具htop
三大进程管理监控工具 HTOP 介绍: Htop是一款运行于Linux系统监控与进程管理软件,htop提供所有进程的列表,并且使用彩色标识出处理器.swap和内存状态.用户一般可以在top无法提供详尽 ...