注意到 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