zoukankan      html  css  js  c++  java
  • 利用谓词实现List<>的Find等高级操作

           public class Person
            {
                public int Id { get; set; }
                public string Name { get; set; }
                public int Age { get; set; }
            }

       private void button1_Click(object sender, EventArgs e) //利用谓词实现List<>的Find查询

            {

                List<Person> ListPerson = new List<Person>();

                ListPerson.Add(new Person() { Name = "刘备" }); //注意这用new对象的赋值方法,没有参数的构造函数也能在创建同时就赋值

                ListPerson.Add(new Person() { Name = "关羽" });

                ListPerson.Add(new Person() { Name = "张飞" });

                ListPerson.Add(new Person() { Name = "汉献帝" });

               

                //一、Contain的注意,如果是引用类型,只能比较同地址的应用,不能比较值完全相同的元素

                //虽然p1与ListPerson[1]完全一样,但由于Person是引用类型,所以ListPerson.Contains(p1)=false,而ListPerson.Contains(ListPerson[1])=true;

                Person p1 = new Person() { Name = "关羽" };

                p1 = ListPerson[1];

                bool ct = ListPerson.Contains(p1);

                //但是,如果Person不是类Class而是结构Struct,则变为值类型,上面两种写法都返回True

                //Class和Struct还有几点区别

                //1、struct不能包含不带参数的构造函数,但可以没有构造函数,在没有构造函数情况下,Person p1 = new Person() { Name = "关羽" };仍然可以

                //2、struct中对象中的某一属性不能单独修改,只能整个对象一起替换,如不能写ListPerson[0].Name=="吕布",但是可以写ListPerson[0] = new Person() { Name = "吕布");

               

                //二、谓词实现高级功能

                //谓词就是形如List.Find(Predicate<T> match); 括号里的就是谓词,它可以是一个委托函数或是一个拉姆表达式

                Person pc = ListPerson.Find(m => m.Name == "刘备"); //括号里的就是拉姆表达式,m代表ListPerson中的一个对象,

                //=>后跟一个逻辑表达式。List中每一个元素都与该逻辑表达式匹配,如果对该元素表达式成立,则选中。对Find函数而言,返回第一个选中的元素。

                //稍微复杂一点的拉姆表达式,返回汉献帝

                pc = ListPerson.Find(m =>

                {

                    if (m.Name.Length > 2)

                        return true;

                    return false;

                });

                //也可以用委托函数的方式实现谓词,语法为:

                pc = ListPerson.Find(ListFind);

                //Find返回第一个满足条件的元素,返回类型与List<>中的元素相同

                //FindAll返回所有满足条件的元素,返回类型也是List<>,相当于返回子集

                //FindLast返回最后一个匹配的元素

                //TrueForAll,如果所有元素都满足条件,返回true,否则false,可用于验证

                //Where与FindAll类似,只不过返回值IEnumerable,要ToList()一下才能返回List<>。例如List<Person> ListPerson2 = ListPerson.Where(m => m.Name != "刘备").ToList();

                //RemoveAll剔除所有满足条件的元素

               

            }

            public bool ListFind(Person p) //委托函数的参数必须与待查找元素相同的类型,返回类型也必须的bool型

            {

                if (p.Name.Length > 2)

                    return true;

                return false;

            }

  • 相关阅读:
    centos7修改服务端口(ssh为例)
    VLAN基础知识
    三层交换机与路由器区别
    冲突域和广播域的区分
    LAN口和WAN口的区别是什么?
    内网穿透frp
    linux bash中too many arguments问题的解决方法
    linux日志
    linux服务管理
    OSPF 多区域配置实验
  • 原文地址:https://www.cnblogs.com/mol1995/p/5972860.html
Copyright © 2011-2022 走看看