为collection增加排序功能

 

注意到 CollectionBase.InnerList属性,这是一个protected 属性,得到一个包含了CollectionBase中的元素的ArrayList。

所以可以调用ArrayList.Sort()来实现排序。

 

using System;

 

public class Person {

      public Person(string name, int age) {

            this.Name = name;

            this.Age = age;

      }

      public string Name;

      public int Age;

}

 

public class People : System.Collections.CollectionBase {

      public int Add(Person p) {

            return List.Add(p);

      }

 

      public void SortByName() {

            System.Collections.IComparer sorter = new NameSortHelper();

            InnerList.Sort(sorter);

      }

      public void SortByAge() {

            System.Collections.IComparer sorter = new AgeSortHelper();

            InnerList.Sort(sorter);

      }

 

      private class NameSortHelper : System.Collections.IComparer {

            public int Compare(object x, object y) {

                  Person p1 = (Person) x;

                  Person p2 = (Person) y;

                  return p1.Name.CompareTo(p2.Name);

            }

      }

 

      private class AgeSortHelper : System.Collections.IComparer {

            public int Compare(object x, object y) {

                  Person p1 = (Person) x;

                  Person p2 = (Person) y;

                  if(p1.Age > p2.Age)

                        return 1;

                  if(p1.Age < p2.Age)

                        return -1;

                  return 0;

            }

      }

}

 

 

class App {

      [STAThread]

      static void Main(string[] args) {

            People people = new People();

            people.Add(new Person("John" , 30));

            people.Add(new Person("Bob" , 20));

            people.Add(new Person("Zeke" , 18));

           

            //people.SortByAge();

            people.SortByName();

 

            foreach(Person p in people) {

                  Console.WriteLine("{0} , {1}", p.Name, p.Age);

            }

      }

}

 

 

http://unboxedsolutions.com/sean/archive/2004/08/10/292.aspx


Related Posts Plugin for WordPress, Blogger...