博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LINQ学前准备之Lambda Expressions
阅读量:4706 次
发布时间:2019-06-10

本文共 2335 字,大约阅读时间需要 7 分钟。

Lambda表达式是C#3.0引进来的语法。Lambda表达式提供了匿名方法的备选方案。虽然Lambda主要用于LINQ操作,但是这种表达式也适用于,并且经常用于委托和事件。

 

Lambda运算符

Lambda采用了全新的运算符”=>”,”=>”为二元运算符,左边是输入参数,右边是Lambda主体。”=>”可描述成”转到”或“成为”.

x=>x

可读成x goes to x或input x return x

 

让我们通过一个例子来看看命名方法、匿名方法、Lambda表达式的不同写法。

假设我们有一个Int的数组,需要根据不同的过滤规则来返回所需要的数组。

 

命名方法

public class Common{	public delegate bool IntFilter(int i);//声明一个命名委托	public static int[] FilterArrayOfInt(int [] ints, IntFilter filter)//传入委托	{		ArrayList alist = new ArrayList();		foreach(int i in ints)		{			if(filter(i))			{				alist.Add(i);			}		}		return (int[])alist.ToArray(typeof(int));	}}
 
此时,我们还需要新建一些IntFilter的类:
public class Application{	public static bool IsOdd(int i)	{		return ((i & 1) == 1);	}}
 
客户端调用:
using System.Collections;int[] nums = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };int[] oddNums = Common.FilterArrayOfInts(nums, Application.IsOdd);foreach (int i in oddNums)	Console.WriteLine(i);

当我们需要不同的filter的时候,我们需要新建一系列类似于Application.IsOdd的方法。

 

匿名方法

像上面的Application.IsOdd方法其实只会被客户端调用一次,同时,我们创建一系列的Application.IsOdd也挺烦的,要维护一系列的类。

C# 2.0引入了匿名方法,匿名方法允许我们不需要创建类似Application.IsOdd方法,而是在需要传入委托方法的时候直接传入一个匿名的方法。

int[] nums = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };int[] oddNums =Common.FilterArrayOfInts(nums, delegate(int i) { return ((i & 1) == 1); });foreach (int i in oddNums)	Console.WriteLine(i);
 
采用这种方法,我们可以不需要再定义多余的Filter类。但是,这种方法的可读性比较差。
 
Lambda表达式
 
int[] nums = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };int[] oddNums = Common.FilterArrayOfInts(nums, i => ((i & 1) == 1));foreach (int i in oddNums)	Console.WriteLine(i);

以下就是三种方式的具体差别:

 

int[] oddNums = // using named methodCommon.FilterArrayOfInts(nums, Application.IsOdd);int[] oddNums = // using anonymous methodCommon.FilterArrayOfInts(nums, delegate(int i){return((i & 1) == 1);});int[] oddNums = // using lambda expressionCommon.FilterArrayOfInts(nums, i => ((i & 1) == 1));
 
命名方法适用于当你的Filter需要可被重复使用的时候。而Lambda提供了更灵活的方式。
 
 
Lambda表达式描述
当Lambda表达式只有一个参数时,其通用形式为:
param=>expr
 
当Lambda表达式需要多个参数时,其通用形式为:
(param-list)=>expr
 
Note:当参数多余一个的时候,参数列表需要包括在圆括号里面。
 
对于上面的例子,i => ((i & 1) == 1)我们可能会困惑,编译器如何知道参数及表达式的类型的呢?
答案是:编译器根据FilterArrayOfInts需要的委托类型(在这个例子中,为IntFilter,他有一个int的输入参数,同时返回bool类型的值)来推断参数的类型和表达式的返回类型。
因此,很重要的一点是:Lambda的参数和返回值类型必须与委托的参数类型和返回值类型相匹配。
 
参考书目:Pro.LINQ.Language.Integrated.Query.in.Csharp.2010

转载于:https://www.cnblogs.com/tian2010/archive/2012/03/04/2379655.html

你可能感兴趣的文章
Nginx(二)
查看>>
CF #329 D
查看>>
Android中pendingIntent的深入理解
查看>>
地图之CLLocationManager的使用 定位功能使用
查看>>
AsyncTask 之怎样使用
查看>>
NancyFX 第九章 Responses(响应对象)
查看>>
C#WinForm 窗体回车替换Tab
查看>>
深入理解java虚拟机(5)---字节码执行引擎
查看>>
jquery之别踩白块游戏的实现
查看>>
从今天开始写博客
查看>>
利用python进行泰坦尼克生存预测——数据探索分析
查看>>
pow log 与 (int)
查看>>
索引的分类--B-Tree索引和Hash索引
查看>>
AcCoder Contest-115 D - Christmas
查看>>
Python学习笔记——参数axis=0,1,2...
查看>>
【原创】Talend ETL Job日志框架——基于P&G项目的一些思考和优化
查看>>
深入了解sql语句以及应用实例
查看>>
如何使用ShareSDK实现Cocos2d-x的Android/iOS分享与授权
查看>>
求欧拉函数
查看>>
2018/01/01Java基础学习——如何通过dos系统的javadoc命令生成API文档
查看>>