Lambda表达式学习.doc_第1页
Lambda表达式学习.doc_第2页
Lambda表达式学习.doc_第3页
Lambda表达式学习.doc_第4页
Lambda表达式学习.doc_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Lambda表达式学习项目里面需要经常对一系列同类型集合进行操作 , 如对集合进行增加元素 , 删除集合的指定索引的元素等等. 我们可以使用ArrayList来进行. 如1ArrayListstringArrayList = newArrayList();2stringArrayList. Add(大家好);3stringArrayList. Add(你们好);4stringArrayList. Add(同志们好);5stringstr1 = (string)stringArrayList0;/取出一个元素后 , 需要转换一次类型才可以或者是1ArrayListintArrayList = newArrayList();2intArrayList. Add(6);3intArrayList. Add(8);4intArrayList. Add(66);5intint1 = (int)intArrayList0;/取出一个元素后 , 需要转换一次类型才可以但是ArrayList中每个元素的类型都是Object(stringArrayList0的类型是Object) , 这意味着我们每一次的操作 , 其实都进行了隐式的类型转换 , 加入资料是把普通类型转换成Object类型 , 取出资料是把Object类型转换成普通类型. 于是我在想象 , 如果有一种数组类型 , 在定义的时候 , 可以给出每个元素具体的类型 , 并且在赋值或者取值的时候 , 就是完全按照这个类型进行操作该多好. 在. net2. 0里面 , 我找到了List这个类型. List是一个泛型 , 我们看看List的使用代码 1ListstringArrayList = newList();2stringArrayList. Add(大家好);3stringstr1 = stringArrayList0;/直接赋值成功!因为取出来的就是string4/或者5ListintArrayList = newList();6intArrayList. Add(8);7intint1=intArrayList0;/直接赋值成功!因为取出来的就是int大家可以看出 , List在实例化的时候就需要定义一个类型 , 也就是尖括号中间的东西 , 在增加元素 , 或者获取元素的时候 , 操作的都是最开始定义的那种类型. List便是传说中的泛型类型. 泛型可以用在方法上 , 也可以用在类上. 如果看到某个方法或者类后面带有尖括号的 , 那么这个肯定就是泛型了. 现在 , 我找到了能够有效存储我要操作的集合类型 , 那么我们要解决一些操作了. 我需要对集合进行一个连接输出(把所有的元素连接在一起 , 每个元素之间使用来分割) , 还需要知道所有元素的总长度. 显然 , 光一个List类型是解决不了问题的. 于是我自己定义了一个自己的泛型类型代码 1/2/这是一个泛型类 , 类名后面接着一个尖括号里面的那个t , 是我们自己定义的 , 如果你高兴 , 你可以定义w , y , z , WC都没有问题!3/这个T表示说我们在实例化类的时候 , 需要告诉类 , 我们是用哪一种类型来进行操作. 4/5/6publicclassMyList78publicList_Listget;set;9publicMyList()1011this. _List = newList();1213/14/用来连接所有元素用15/16/连接后的字符串17publicstringJoinOut()1819StringBuilderstbTemp = newStringBuilder();20foreach(varitemin_List)2122stbTemp. Append(item);23stbTemp. Append();2425returnstbTemp. ToString();2627/28/所有元素的长度29/30/元素的整体长度31publicintAllLen()3233StringBuilderstbTemp = newStringBuilder();34foreach(varitemin_List)3536stbTemp. Append(item);3738returnstbTemp. Length;394041但是如果我在求元素长度的时候 , 要求如果是stirng则返回所有元素的长度 , 而是int的时候 , 则返回所有元素的和. 于是我重写了AllLen方法代码 1publicintAllLen()23/StringBuilderstbTemp = newStringBuilder();4/foreach(varitemin_List)5/6/stbTemp. Append(item);7/8/returnstbTemp. Length;910StringBuilderstbTemp = newStringBuilder();11vartype = typeof(T);12if(type = = typeof(string)1314foreach(varitemin_List)1516stbTemp. Append(item);17stbTemp. Append();1819returnstbTemp. Length;2021if(type = = typeof(int)2223intintSum = 0;24foreach(varitemin_List)2526intSum+ = int. Parse(item. ToString();2728returnstbTemp. Length;293031/*这里可能还需要根据不同的类型进行不同的处理32*/33return0;34我在整个项目中 , 会负责编写公用类库. 我不知道其他前台编码人员需要什么样子的操作. 并且前台编码人员会各处一些稀奇古怪的需求我 , 要我实现 , 如他想接受一系列的bool类型 , 然后判断所有结果为True的数量 , 或者传入一系列的日期 , 判断所有星期一的日期有多少个. . . 等等. 我比较懒 , 并且我非常不愿意去修改我已经写好的类库. 所以我又对Allen进行了一次修改. 代码 1/写一个委托 , 谁愿意做什么操作就自己写去 , 哥不管了!2publicdelegateintdelegateAllLen(Listlist);3/写一个委托 , 谁愿意做什么操作就自己写去 , 哥不管了!4publicdelegateAllLenFuncAllLenget;set;5publicintAllLen()67if(FuncAllLen! = null)89returnFuncAllLen(_List);1011return0;12我告诉前台编码人员 , 你们想做什么就先去实现委托FuncAllLen. 然后调用AllLen方法. 代码 1/2/委托的实现3/4/5/6publicintTemp(Listbln)78inti = 0;9foreach(variteminbln)1011if(item)i+;1213returni;141516publicvoidMain()1718varlist = newMyList();1920list. _List. Add(true);21list. _List. Add(false);22list. _List. Add(true);23/实现委托24list. FuncAllLen+ = Temp;25MessageBox. Show(list. AllLen(). ToString();262728现在我就轻松多了 , 可以去睡大觉了!所有的具体操作 , 前台编码人员自己去实现FuncAllLen 这个委托去!我全部不管了!哈哈哈!不过这样写可能还是有有点难以理解. 一会定义一个delegate int delegateAllLen(List list);一会又是delegateAllLen FuncAllLen get; set; , 都不知道那个是那个. . . . 于是我采用C#3. 5中委托的写法代码 1/*2publicdelegateintdelegateAllLen(Listlist);3publicdelegateAllLenFuncAllLenget;set;4以上这两句 , 可以简写成下面的一句!5*/6publicFuncList , intFuncAllLenget;set;调用的方法和以前一样 , 可是编码人员告诉我:这样你方便了 , 我们可就麻烦了 , 每次都要记得在使用AllLen方法的时候 , 都要先把委托实现了. 特别是新来的人 , 总是记不住. 正好 , 最近我在学习Linq , c#3. 5中推出了拉姆达表达式 , 可以让委托更简单的实现!于是我最后一次重写AllLen方法代码 1/我要使用最先进 , 最流行的拉姆达表达式!所以下面的这行委托我不需要了!哈哈哈哈2/publicFuncList , intFuncAllLenget;set;34/其实我把上面的委托定义放到函数里面当参数了. . . . 5publicintAllLen(FuncList , intFuncAllLen)67if(FuncAllLen! = null)89returnFuncAllLen(_List);1011return0;12最后我们看看调用的方法代码 1publicvoidMain()23varlist = newMyList();45list. _List. Add(true);6list. _List. Add(false);7list. _List. Add(true);8/传说中的拉姆达表达式出现了!9intintRef = list. AllLen(10PList = 1112inti = 0;13foreach(variteminPList)1415if(item)i+;1617returni;18);19具体我们来看看拉姆达表达式的用法!拉姆达表达式由三个部分组成 , = 是拉姆达中固定的符号 , 必须出现! = 左边的表达式是一个参数列表 , 是一组没有类型的字符(字符怎么写随意!只要符合命名规范就好了) , 每个字符表示一个参数 , 每个参数之间使用逗号分割. 如:如果有三个参数 , 则表达式为(A , B , C) , 或者是(P1 , P2 , P3) , = 右边的是具体要实现的代码段 , 代码段里面可以使用参数列表中的参数进行各种运算. 如:return P1+P2+p3;合起来就是 (P1 , P2 , P3) = return P1+P2+P3;如果参数只有一个 , 那么省去小括号:P1 = return P1+10;如果具体的实现代码只有一句返回语句 , 则可以简写成 P1 = P1+10;一定要注意 , 拉姆达表达式只是一个委托的定义而已 , 当程序运行到拉姆达表达式的时候 , 拉姆达表达式里面的语句是不会被立刻执行的 , 很多人在初学拉姆达或者委托的时候都会犯这种错误. 如:代码 1publicvoidMain()23varintSumTemp = Sum(tempInt) = returntempInt+1;);456publicintSum(Funcfunc)78varint1 = 5;9int1+ = 5;10varintTemp = func(int1);11returnintTemp*intTemp;12上面的intSumTemp的结果是121. 运行的顺序是:首先调用Sum方法而不会去执行拉姆达表达式. 然后得到int1 = 10的结果(5+5) , 接着需要运行func了 , 并且知道func的参数值是int1 , 即10. 那么func是通过拉姆达表达式定义的 , 所以这个时候 , 我们把10传入拉姆大表达式中 , 进行运算得到11(10+1)方法最后是一个平方操作. 结果为121(11*11)知道拉姆达的写法 , 和使用的方法 , 那么我们在什么情况下可以使用拉姆达表达式能?当我们在使用一个方法 , 方法的参数是Func , 或Action , 那么就可以使用拉姆达表达式了!我们拿linq里面的方法举例!public static IEnumerable Where(this IEnumerable source , Func predicate);可写成 var temp = _List. Where(P = return true;);public static int Sum(this IEnumerable source , Func selector);可写成 var temp = _List. Sum(P = P. count);拉姆达表达式学习(2) 在. net3. 5里面 , 委托的定义和实现被大大的简化了!使用关键字Func或Action就可以定义一个委托 , 使用拉姆达表达式就可以实现一个具体的委托. Func关键字是用来定义一个有返回值的委托 , 它一共有五个重载 , 我们介绍其中的三个1 public delegate TResult Func(); 这表示一个没有参数 , 只有一个返回值的委托 , 返回值的类型就是TResult(泛型)代码 1publicclasstest23/4/定义一个委托5/6publicFunc_GetName;7/8/一个普通的没有参数 , 有返回值的方法9/10/11publicstringGetName()1213return张三;1415publicvoidMain()1617/3. 5以前的委托的实现 , 直接赋值18_GetName = GetName;1920/拉姆达表达式的实现方法21_GetName = (22()/因为这个委托没参数 , 所以参数列表没有东西23 = /拉姆达表达式的符号24/大括号的代码段表示具体的委托的实现25return还是张三;26);27/拉姆达表达式的简写 , 如果委托的实现代码段中只有一句return则可以省略代码段最外面的大括号 , 和return关键字28_GetName = () = 总是张三;29/调用30stringMyName = _GetName();31322 public delegate TResult Func(T arg);这表示有且仅有一个参数 , 并且有返回值的委托. 代码 1publicclasstest23/4/定义一个委托 , 有一个参数和一个返回值5/6publicFunc_GetName;7/8/有一个参数的方法9/10/这是一个参数!11/这是一个返回值12publicstringGetName(stringstrName)1314returnstrName;1516publicvoidMain()1718/3. 5以前的委托的实现 , 直接赋值19_GetName = GetName;2021/拉姆达表达式的实现方法22_GetName = (23(S)/有一个参数!所以参数列表里面有一个东西 , 这个东西随大家高兴叫个阿猫阿狗都行!只要符合规范24 = /拉姆达表达式的符号25/大括号的代码段表示具体的委托的实现26return还是+S;27);28/拉姆达表达式的简写 , 如果委托的实现代码段中只有一句return则可以省略代码段最外面的大括号 , 和return关键字29_GetName = (abc) = 总是+abc;30/调用31stringMyName = _GetName(张三);32333 public delegate TResult Func(T1 arg1 , T2 arg2);这表示有且仅有两个参数 , 并且有返回值的委托. 代码 1publicclasstest23/4/定义一个委托 , 有一个参数和一个返回值5/6publicFunc_GetName;7/8/这是一个有两个参数的方法 , 方法的参数类型的顺序必须和委托的参数类型顺序一致9/10/第一个是字符类型11/第二个是整形 , 请不要颠倒类型!12/返回一个字符串 , 对应委托的最后一个参数13publicstringGetName(stringstrName , intintAGE)1415returnstring. Format(0的年龄是1岁 , strName , intAGE);1617publicvoidMain()1819/3. 5以前的委托的实现 , 直接赋值20_GetName = GetName;2122/拉姆达表达式的实现方法23_GetName = (24(S , W)/有一个参数!所以参数列表里面有一个东西 , 这个东西随大家高兴叫个阿猫阿狗都行!只要符合规范25 = /拉姆达表达式的符号26/大括号的代码段表示具体的委托的实现27returnstring. Format(0的年龄是1岁 , S , W);28);29/拉姆达表达式的简写 , 如果委托的实现代码段中只有一句return则可以省略代码段最外面的大括号 , 和return关键字30_GetName = (abc , efd) = string. Format(0的年龄是1岁 , abc , efd);31/调用32stringMyName = _GetName(张三 , 33);3334Action关键字用来定义一个没有返回值的方法 , 它有一个非泛型方法 , 和四个泛型方法 , 一共五种. Action和func的区别就在于一个没有返回值 , 一个有返回值!其他的都一样!就好像VB的sub和function一样!1 public delegate void Action();没有参数也没有返回值代码 1publicclasstest23/4/定义一个委托 , 没有返回值也没有参数5/6publicAction_GetName;78publicvoidGetName()910System. Windows. Forms. MessageBox. Show(没有参数也没有返回值 , 我只要自己显示了!);1112publicvoidMain()1314/3. 5以前的委托的实现 , 直接赋值15_GetName = GetName;1617/拉姆达表达式的实现方法18_G

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论