比较器

主要内容:

代码

 

制作时间 2009/9/22  23:40- 00:30

目标:用比较器给集合排序(其中,集合中保存的是对象,排序方式按对象的某个属性(如:Student对象的Name))

实现:
  1.简单实现(例子:SimpleDemo)
     1.新建一个类Student,里面加几个内部类(表示这个对象是可比较的)
        为什么做成内部类?答:应该可以实现更好的封装吧,而且也比较好找,效率高
        public class SortByName:IComparer<Student>
        {
            public int Compare(Student x, Student y)
            {
                return x.Name.CompareTo(y.Name);
            }
        }
     2.新建一个窗体SimpleDemo,拖一个DataGridView(dgvStudent)
         1.新建集合并添加值
            List<Student> students = new List<Student>();
            students.Add(new Student("肖新苗",100));
            students.Add(new Student("张韶涵", 99));
         2. 给集合排序,并和DataGridView绑定,这样就OK了
        private void btnNameAsc_Click(object sender, EventArgs e)
        {
            students.Sort(new Student.SortByName());
            BindDgvStudent();
        }
     3.总结:比较器的实现
         1.需要有个对象类(Student),里面有内部类(SortByName:IComparer<Student>)
         2.有个此对象的集合,调用集合的Sort(new Student.SortByName());

  2.用DataGridView实现(点击列标题就可以排序)
      1.Student对象和他的内部类同上
      2.新建窗体DataGridViewSort
         1.新建并初始化集合 同上
         2.找到用户单击列标题时的事件(ColumnHeaderMouseClick)
           并写代码,反射内部内要把"."变成"+"(如:ComparerDemo.Student+SortByName)
         3.代码
        //用户单击列标题时的事件
        bool flag = true;//用来切换升序和降序(如点列标题(姓名),第一次若为升序,第二次点就要换为降序)
        private void dgvStudent_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
        {
            //通过事件源找到控件的Name(也就是列标题,和绑定集合里对象的字段对应,如:Name,Popularity)
            string comparerName=string.Format("ComparerDemo.Student+SortBy{0}",
                                          ((DataGridView)sender).Columns[e.ColumnIndex].Name);
            if (flag)//如果为真调用升序比较器
            {
                flag = false;
            }
            else//否则,调用降序比较器
            {
                comparerName += "Desc";
                flag = true;
            }

            //下面是通过字符串反射对象(即:反射得到比较器)
            Type type = Type.GetType(comparerName);
            if (type != null)
                students.Sort((IComparer<Student>)System.Activator.CreateInstance(type));
            BindDgvStudent();//排序后,重新绑定DataGridView
        }
  3.用ListView实现
      1.Student对象和他的内部类同上
      2.新建窗体ListViewSort
         1.新建并初始化集合 同上
         2.找到用户单击列标题时的事件(ColumnClick)
      3.代码(和DataGridView类似)

       (和上面也一样,唯一不同的是得到列标题的名字(comparerName))
       
        //用户单击列标题时的事件
        bool flag = true;//用来切换升序和降序(如点列标题(姓名),第一次若为升序,第二次点就要换为降序)
        private void lvStudent_ColumnClick(object sender, ColumnClickEventArgs e)
        {
            lvStudent.Sorting = SortOrder.None;//防止最开始的时候,设置SortOrder.Ascending;
            //通过事件源找到控件的Name(也就是列标题,和绑定集合里对象的字段对应,如:Name,Popularity)
            string comparerName = string.Format("ComparerDemo.Student+SortBy{0}",
                                           ((ListView)sender).Columns[e.Column].Name.ToString());
            if (flag)//如果为真调用升序比较器
            {
                flag = false;
            }
            else//否则,调用降序比较器
            {
                comparerName += "Desc";
                flag = true;
            }
            //下面是通过字符串反射对象(即:反射得到比较器)
            Type type = Type.GetType(comparerName);
            if (type != null)
                students.Sort((IComparer<Student>)System.Activator.CreateInstance(type));
            BindLvStudent();//排序后,重新绑定ListView
        }

 

你可能感兴趣的:(比较)