利用谓词实现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;

 

        }

 

posted on 2016-10-18 12:48  mol1995  阅读(304)  评论(0编辑  收藏  举报

导航