博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linq快速入门——Lambda表达式的前世今生
阅读量:6636 次
发布时间:2019-06-25

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

Lambda表达式其实并不陌生,他的前生就是匿名函数,所以要谈Lambda表达式,就不得不谈匿名函数,要谈匿名函数,那又要不得不谈委托。

何为委托

委托非常好理解,类似于C++里面的函数指针(指向了一个方法),并且委托约束了待指向方法的签名(由返回类型和参数组成)。

 
using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace 委托Test{    delegate bool FilterDelegate(int i);    class Program    {        static void Main(string[] args)        {            int[] array = { 1, 2, 3, 5, 6, 6, 7, 8, 9 };            List
newList = MyFilter(array,FilterOdd); foreach (int item in newList) { Console.WriteLine(item); } Console.ReadKey(); } static List
MyFilter(int[] array, FilterDelegate filter) { List
list = new List
(); for (int i = 0; i < array.Length; i++) { if (filter(i)) { list.Add(i); } } return list; } ///
/// 偶数 /// ///
///
static bool FilterEven(int i) { return i % 2 == 0; } ///
/// 奇数 /// ///
///
static bool FilterOdd(int i) { return i % 2 == 1; } }}

对于上面这个Demo可以看出,我需要定义了两个方法(FilterOdd,FilterEven),让我的委托变量指向这两个方法。但有时候申明方法很麻烦,还要考虑方法名称不重复,所以对于一些我们只使用一次的方法,完全没有必要单独为其申明,使用匿名方法即可(C# 2.0为程序员提供了匿名方法),大大简化了操作

匿名方法

//例如delegate void Del(int x);....Del d = delegate(int k) { /* ... */ };

所以上面例子小小改动一下即可:

using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace 委托Test{    delegate bool FilterDelegate(int i);    class Program    {        static void Main(string[] args)        {            int[] array = { 1, 2, 3, 5, 6, 6, 7, 8, 9 };            //使用匿名方法来求偶数            List
newList = MyFilter(array, delegate(int i) { return i % 2 == 0; }); foreach (int item in newList) { Console.WriteLine(item); } Console.ReadKey(); } static List
MyFilter(int[] array, FilterDelegate filter) { List
list = new List
(); for (int i = 0; i < array.Length; i++) { if (filter(i)) { list.Add(i); } } return list; } }}

Lambda表达式特性

  • C# 2.0中加入的匿名方法,简化了我们编写事件处理函数的工作,使我们不再需要单独声明一个函数来与事件绑定,只需要使用delegate关键字在线编写事件处理代码。
  • 而C# 3.0则更进一步,通过Lambda表达式,我们可以一种更为简洁方式编写事件处理代码,新的Lambda事件处理代码看上去就像一个计算表达式,它使用"=>"符号来连接事件参数和事件处理代码。我可以这样写:SomeEvent += 事件参数 => 事件处理代码;

所以上面代码稍稍修改后,用Lambda表达式来替换匿名方法:

using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace 委托Test{    delegate bool FilterDelegate(int i);    class Program    {        static void Main(string[] args)        {            int[] array = { 1, 2, 3, 5, 6, 6, 7, 8, 9 };            //使用Lambda表达式来求偶数            List
newList = MyFilter(array, i => i % 2==0); foreach (int item in newList) { Console.WriteLine(item); } Console.ReadKey(); } static List
MyFilter(int[] array, FilterDelegate filter) { List
list = new List
(); for (int i = 0; i < array.Length; i++) { if (filter(i)) { list.Add(i); } } return list; } }}

注意:

  • 使用Lambda表达式,"=>"之前为参数列表,如果有多个参数,则不能省略括号,比如:(s,e)=>....
  • 如果方法有返回值,并且处理代码只有一行,可以简写成i=>i%2==0,等价于i=>{return i%2==0},反之对于有多行的处理代码,则不能简写,必须写完整,比如:(s,e)=>{...程序代码块...}

 

转载于:https://www.cnblogs.com/xiexingen/archive/2012/09/27/2706164.html

你可能感兴趣的文章
java 密码扩展无限制权限策略文件
查看>>
python的virtualenv和pip
查看>>
Sublime Text 3 安装 Package Control
查看>>
DoModal 函数的用法
查看>>
Java 持有对象简要笔记
查看>>
http协议
查看>>
CodeIgniter3.0项目推荐
查看>>
【远程调用框架】如何实现一个简单的RPC框架(三)优化一:利用动态代理改变用户服务调用方式...
查看>>
解析用PHP读写音频文件信息的详解(支持WMA和MP3)
查看>>
C#生成PDF页脚第几页共几页
查看>>
tomcat安装后提示无法显示该网页
查看>>
lint 检查有无使用高版本的api和无用的资源
查看>>
【linux】grep 和【perl】 脚本实现的grep功能的运行时间差异
查看>>
php strpos 字符串查找函数内部源码实现
查看>>
linux+nginx并发量大的时候出现Too many open files问题
查看>>
C++动态数组
查看>>
php 调用远程url的六种方法小结
查看>>
FTP服务器 传输性能测试之Raid 1+0篇
查看>>
PHP实现倒计时
查看>>
CAS服务端,查询数据库验证
查看>>