构建可比较的对象(Icomparable)

System.Icomparable接口指定了一种允许一个对象可基于其些特定键值进行排序行为,以下是正式定义
public interface IComparable
{
      int CompareTo(Object o);
}

不说太多废话,直接看例子,更直接

public class Car
{
        private int carID;
        private string carName;
        public int ID
        {
            get { return this.carID; }
            set { carID = value; }
        }
        public string Name
        {
            get { return this.carName; }
            set { this.carName = value; }
        }
        public Car(int id, string name)
        {
            this.carID = id;
            this.carName = name;
        }
}

static void Main(string[] args)
{
            //创建一个car数组
            Car[] myCars = new Car[3];
            myCars[0] = new Car(2, "qqqqq");
            myCars[1] = new Car(1, "zzz");
            myCars[2] = new Car(3, "aaa");
            Console.Read();
}

如果此时我们使用system.array类定义了一个名为sort()的静态方法对car[]数组进行排序,会怎么样呢?
噢.报错了!提示"At lesat one object must implement IComparable"意思是说"至少要有一个对象实现IComparable",那行,人家都明说了,要实现IComparable,那我们就实现咯!那我们要根据什么来排序呢?根据ID吧!请让Car类实现IComparable接口以及接口中的方法,接口中的方法具体代码如下
public int CompareTo(object obj)
{
    Car temp = (Car)obj;
    return this.carID.CompareTo(temp.carID);
}
这时再运行,就正常了!按照ID排序了(如果想倒序的话,再用Array.Reverse()这个静态方法就行了)

那如果我们想构造一个即可以按id排序又可以按name排序,又应怎么办?
这就需要用到IComparer接口了.以下是IComparer正式的定义
interface Icomparer
{
 int Compare(Object obj1,Object obj2);
}
与Icomparable接口不同的是IComparable接口是在排序的类型(即Car)中实现的,而IComparer是通过辅助类来完成的.
添加PetNameComparer辅助类
 public class PetNameComparer : IComparer
    {
        public int Compare(object o1, object o2)
        {
            Car c1 = (Car)o1;
            Car c2 = (Car)o2;
            return string.Compare(c1.Name, c2.Name);
        }
    }
再把main方法里面的这句代码
Array.Sort(myCars);
改成
Array.Sort(myCars,new PetNameComparer());
这样就完成了!这个car类即可以按id排序,又可以按name排序!


感觉写得比较乱!不过如果细看的话,大概的意思应该可以表达清楚的!这个是看书时写下的笔记!

posted on 2010-05-30 22:43  Ss_Andy  阅读(1157)  评论(0编辑  收藏  举报