zoukankan      html  css  js  c++  java
  • Linq快速入门——Lambda表达式的前世今生

    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<int> newList = MyFilter(array,FilterOdd);
                foreach (int item in newList)
                {
                    Console.WriteLine(item);
                }
                Console.ReadKey();
    
            }
            static List<int> MyFilter(int[] array, FilterDelegate filter)
            {
                List<int> list = new List<int>();
                for (int i = 0; i < array.Length; i++)
                {
                    if (filter(i))
                    {
                        list.Add(i);
                    }
                }
                return list;
            }
            /// <summary>
            /// 偶数
            /// </summary>
            /// <param name="i"></param>
            /// <returns></returns>
            static bool FilterEven(int i)
            {
                return i % 2 == 0;
            }
            /// <summary>
            /// 奇数
            /// </summary>
            /// <param name="i"></param>
            /// <returns></returns>
            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<int> newList = MyFilter(array, delegate(int i) {
    
                    return i % 2 == 0;
                });
             
                foreach (int item in newList)
                {
                    Console.WriteLine(item);
                }
                Console.ReadKey();
    
            }
            static List<int> MyFilter(int[] array, FilterDelegate filter)
            {
                List<int> list = new List<int>();
                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<int> newList = MyFilter(array, i => i % 2==0);
             
                foreach (int item in newList)
                {
                    Console.WriteLine(item);
                }
                Console.ReadKey();
    
            }
            static List<int> MyFilter(int[] array, FilterDelegate filter)
            {
                List<int> list = new List<int>();
                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)=>{...程序代码块...}
  • 相关阅读:
    DBA-常用到的动态视图分析语句
    SQL Server 复制(Replication) ——事务复制搭建
    SQL Server 不同网段IP通过名称访问
    [javaEE] HTTP协议总结
    [android] 从gallery获取图片
    [android] 加载大图片到内存
    [javaEE] web应用的目录结构&配置虚拟主机
    [android] 代码注册广播接收者&利用广播调用服务的方法
    [android] 采用aidl绑定远程服务
    [Linux] Linux的环境变量
  • 原文地址:https://www.cnblogs.com/xiexingen/p/2706164.html
Copyright © 2011-2022 走看看