zoukankan      html  css  js  c++  java
  • 委托、匿名函数到lambda表达式

    在C#2.0之前就有委托了,在2.0之后又引入了匿名方法,C#3.0之后,又引入了Lambda表达式,他们三者之间的顺序是:委托->匿名表达式->Lambda表达式,微软的一步步升级,带给我们编程上的优美,简洁,可读性强.....其实是说到底Lambda表达式也是匿名方法的一种,下面咋们就简单聊聊这几者之间的微妙关系。

    声明一个委托:

     delegate int calculator(int num1, int num2);

    下面分别采用委托方式、匿名方法方式以及lambda表达式来实现下:

    (1)

    calculator new_calculator = new calculator(NumAdd); //委托

    private int NumAdd(int num1, int num2)

    {
    return num1 + num2;
    }

    int nums = new_calculator(10, 1);

    (2)

    calculator new_calculator2 = delegate(int a, int b) { return a + b; }; //匿名
    int nums2 = new_calculator2(10, 1);

    (3)

    calculator new_calculator3 = (x, y) => x + y;//lambda表达式
    int nums3 = new_calculator3(10, 1);

    string strMsg = string.Format("nums={0},nums2={1},nums3={2}", nums, nums2, nums3);

    很明显三种方式结果是一直都是11,但是有没有发现我们的代码在越来越精简,越来越显得有逼格,O(∩_∩)O哈哈~

    这其实就是简单的例子来介绍下,这三者的关系,其实我们平时用的比较多的是Lambda表达式操作数据集合对象,下面举个小例子看看:

    List<Person> listPerson = new List<Person>();
    listPerson.Add(new Person { Name = "Alice", Address = "北京", Age = 30 });
    listPerson.Add(new Person { Name = "Joe", Address = "上海", Age = 34 });
    listPerson.Add(new Person { Name = "Cat", Address = "广州", Age = 24 });
    listPerson.Add(new Person { Name = "Alan", Address = "深圳", Age = 26 });
    listPerson.Add(new Person { Name = "Tom", Address = "重庆", Age = 28 });
    listPerson.Add(new Person { Name = "Jarrey", Address = "天津", Age = 40 });

    (Person就是个实体对象,在此就不贴声明实体对象的代码了)

    现在咋们有了一个Person对象集合了,比如我们想用Lambda表达式处理下,得到Age小于30的Person:

    //委托方式和Lambda表达式对比

    (1)

    IEnumerable<Person> result = listPerson.Where(delegate(Person p) { return p.Age < 30; });//委托方式

    (2)

    IEnumerable<Person> result = listPerson.Where  (p => p.Age < 30); //Lambda表达式

    如果我们用遍历的方式是不是也可以得到我们想要的对象集合?答案是: 当然可以

    (3)

    List<Person> listPersonNew = new List<Person>();
    foreach (var item in listPerson)
    {
    if (item.Age <30)
    {
    listPersonNew.Add(item);
    }
    }

    这是比较传统的方式,我么也可以直接用Lambda表达式遍历集合,舍弃传统的遍历方式:

    (4)

    List<Person> listPersonNew = new List<Person>();
    listPerson.ForEach(p => {
    if (p.Age <30)
    {
    listPersonNew.Add(p);
    }

    });

    遍历以上四个结果会发现,结果一致,都包含了Cat、Alan、Tom三个人。

    以上四种方式,如果是你,你会用哪种方式?方式一和方式二你更倾向哪种?方式三和方式四你又更倾向哪种?

    其实总得来看,Lambda表达式还是为我们编码提供了更简便、更直观的方式,还是挺不错的。

  • 相关阅读:
    Glide优化
    Java多线程知识点
    Android知识点
    Gradle的一些技巧和遇到的问题
    Python用Django写restful api接口
    Python写爬虫爬妹子
    用最简单的例子说明设计模式(三)之责任链、建造者、适配器、代理模式、享元模式
    【Python】扫描指定文件夹下特定后缀的文件
    【Python】生成多级树结构的xml文件
    【转】【Linux】安装pyinstaller
  • 原文地址:https://www.cnblogs.com/become/p/8669596.html
Copyright © 2011-2022 走看看