构建可比较的对象(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排序!
感觉写得比较乱!不过如果细看的话,大概的意思应该可以表达清楚的!这个是看书时写下的笔记!