冒泡排序法我们都很熟悉,但是这种方法对于int类型很适合,如果我需要比较的对象类型不是int型怎么办呢?这个时候就可以考虑使用委托,他将方法作为参数,具体参数的类型要延迟到客户端才来实现,可以看下面的代码,用来比较公司每一位员工的薪水。
// 声明委托,将对象x和y进行比较
// 这里声明的委托Comparison将两个对象进行比较
delegate bool Comparison (object x , object y );
class BubbleSorter
{
public static void Sort (object [] SortArray , Comparison comparision )// 使用委托作参数,因为不知道要比较的类型
{
for (int i = 0 ; i < SortArray . Length ; i ++)
{
for (int j = i + 1 ; j < SortArray . Length ; j ++)
{
if (comparision (SortArray [ i ], SortArray [ j ])) // 如果第一个小于第二个,return true
{
// 将两个数进行兑换,这样较大的数放在了前面
object temp = SortArray [ i ];
SortArray [ i ]= SortArray [ j ];
SortArray [ j ]= temp ;
}
}
}
}
}
class Employee
{
private string name ;
private decimal salary ;
public Employee (string name , decimal salary )
{
this . name = name ;
this . salary = salary ;
}
// 重载ToString()方法
public override string ToString ()
{
return string . Format ("{0},{1:C}" , name , salary );
}
// 比较两个对象的薪水,并返回他们的比较结果,结果为布尔类型
// 可以看到,这个函数的返回类型和传入的参数于委托类型相同,因此可以使用委托掉用此方法
public static bool CompareSalary (object x , object y )
{
Employee e1 = (Employee )x ;
Employee e2 = (Employee )y ;
return (e1 . salary < e2 . salary );
}
}
class Program
{
static void Main ()
{
Employee [] employees =
{
new Employee ("zhangsan" , 1000 ),
new Employee ("lisi" , 5000 ),
new Employee ("desheng" , 10000000000000000000 ),
new Employee ("wangwu" , 3004 )
};
// 静态方法直接调用
BubbleSorter . Sort (employees , Employee . CompareSalary );
foreach (var employee in employees )
{
Console . WriteLine (employee );
}
Console . ReadKey ();
}
}
从上面的代码 看到,委托的优势在于它的灵活,客户机代码知道类中传递的是什么方法,封装这个方法就可以进行比较。