欢迎光临散文网 会员登陆 & 注册

[C#学习笔记13]泛型集合List详解、比较器接口动态排序、集合数据源展示

2020-05-04 22:50 作者:技术龙的传人  | 我要投稿

集合定义不用规定元素个数

泛型表示程序特性,定义时无需指定特定类型,使用时必须明确类型。应用在集合、方法、类中,用<T>表示

List<Course> courseList = new List<Course>();//Course是上一笔记中的类

courseList.Add(course1);

courseList.Add(course2);

使用集合初始化器,将元素一次性的初始化到集合中

List<Course> couseList = new List<Courses>() {course1,course2};

数组中的元素添加到集合中

Course[] courseArray1 = new Course[] {course1,course2};

List<Course> couseListFromArray = new List<Course>();

courseListFromArray.AddRange(courseArray1);

集合转换成数组

Course[] courseArray2 = courseList.ToArray();

数组直接转换成集合

List<Course> courseList3 = courseArray2.ToList();

删除元素

courseList.Remove(course3);

courseList.RemoveAll(c >= c.Coursed > 10002);

courseList.RemoveAt(2);

courseList.RemoveRange(1,2);


//集合遍历的两种方式

        public void TraversalList1(List<Course> courseList)

        {

            for (int i = 0; i < courseList.Count; i++)

            {

                Console.WriteLine($"{courseList[i].CourseId}\t{courseList[i].CourseName}\t{courseList[i].ClassHour}\t{courseList[i].Teacher}");

            }

        }

        public void TraversalList2(List<Course> courseList)

        {

            foreach (Course item in courseList)

            {

                Console.WriteLine($"{item.CourseId}\t{item.CourseName}\t{item.ClassHour}\t{item.Teacher}");

            }

        }

        /// <summary>

        /// 集合快速查询方法

        /// </summary>

        /// <param name="courseList"></param>

        public void QueryElements(List<Course> courseList)

        {

            //集合查询方法1

            List<Course> result1 = courseList.FindAll(c => c.CourseId > 10003);

            //集合查询方法2

            var result2 = from c in courseList where c.CourseId > 10003 select c;

            var result3 = result2.ToList();

        }

集合元素排序

        public void ListOrder()

        {

//值类型元素的排序

            Console.WriteLine("\r\n----------------------值类型元素排序------------------\r\n");

            List<int> ageList = new List<int> { 20, 19, 25, 30, 26 };

            ageList.Sort();//默认按照升序排列


            foreach (int item in ageList)

            {

                Console.WriteLine(item);

            }

            ageList.Reverse();

            Console.WriteLine("-------------");

            foreach (int item in ageList)

            {

                Console.WriteLine(item);

            }

对象集合

            //对象集合元素排序(默认)

            Console.WriteLine("\r\n----------------------集合默认排序------------------\r\n");

            List<Course> courseList = CreateCourses();

            courseList.Sort();


            //以上Sort方法默认会报错的!所以在Course类中实现系统接口IComparable<Course>

            TraversalList1(courseList);

            //以上我们使用默认比较器进行排序,很不方便,如果我们需要多种排序,怎么办?


            //比较器接口:其实就是我们可以任意的指定对象属性排序,从而实现动态排序。

            //集合元素动态排序

            Console.WriteLine("\r\n----------------------集合动态排序------------------\r\n");


            //排序方法的定义: public void Sort(IComparer<T> comparer);

            courseList.Sort(new CourseIdASC());

            Console.WriteLine("-----------按照编号升序---------\r\n");

            TraversalList1(courseList);


            Console.WriteLine("\r\n-----------按照编号将序---------\r\n");

            courseList.Sort(new CourseIdDESC());

            TraversalList1(courseList);


            //重要的是理解多态的原理,因为Sort这个重载的方法就是多态原理的一个应用。

            //后面深入学习架构开发等更高级的理论,技能,设计模式等,处处都在用多态!

            Console.WriteLine("\r\n--------后面高级课程中,使用LINQ实现排序------------");

            var list1 = from c in courseList orderby c.CourseId ascending select c;

            TraversalList1(list1.ToList());


            Console.WriteLine("\r\n--------后面使用扩展方法OrderByDescending实现降序------------");

            var list2 = courseList.OrderByDescending(c => c.CourseId);

            TraversalList1(list2.ToList());

            Console.WriteLine("\r\n--------后面使用扩展方法OrderBy实现升序序------------");

            var list3 = courseList.OrderBy(c => c.ClassHour);

            TraversalList1(list3.ToList());

        }


        #endregion

    }

自定义排序类:根据需要,添加对应个数的排序类

    /// <summary>

    /// 课程编号升序

    /// </summary>

    class CourseIdASC : IComparer<Course>

    {

        public int Compare(Course x, Course y)

        {

            return x.CourseId.CompareTo(y.CourseId);

        }

    }

    /// <summary>

    /// 课程编号降序

    /// </summary>

    class CourseIdDESC : IComparer<Course>

    {

        public int Compare(Course x, Course y)

        {

            return y.CourseId.CompareTo(x.CourseId);

        }

    }

    /// <summary>

    /// 课时升序

    /// </summary>

    class CourseClassASC : IComparer<Course>

    {

        public int Compare(Course x, Course y)

        {

            return x.ClassHour.CompareTo(y.ClassHour);

        }

    }

类:系统接口以I开头<>,点击智能标签实现接口就显示了接口对应的比较方法不要动

public class Course : IComparable<Course>

    {

        public Course() { }

        public Course(int courseId, string courseName, int classHour, string teacher)

        {

            this.CourseId = courseId;

            this.CourseName = courseName;

            this.ClassHour = classHour;

            this.Teacher = teacher;

        }

        public int CourseId { get; set; }//课程编号

        public string CourseName { get; set; }//课程名称

        public int ClassHour { get; set; }//课时

        public string Teacher { get; set; }//主讲老师

        //接口对应的比较方法(这个方法的签名,千万不要动)

        public int CompareTo(Course other)

        {

            //return this.CourseId.CompareTo(other.CourseId);

            return other.CourseId.CompareTo(CourseId);

            //如果把this放到前面,表示按照升序排列,other放到前面就是按照降序排列

        }

    }




[C#学习笔记13]泛型集合List详解、比较器接口动态排序、集合数据源展示的评论 (共 条)

分享到微博请遵守国家法律