通用排序函数的功能实现(利用接口和委托实现泛型[通用]排序)

开发过程中可能会遇到这样的情况:需要定义一个公用的排序函数,该函数能够对所有类型的对象数组进行排序,要实现该功能最关键的一点是知道对象之间比较大小的规则, 排序函数怎样才能知道该规则呢?有两种途径,一种途径是通过接口,另一种途径是通过委托。

通过接口来实现有两种思路。

 

一种思路是:接口中定义一个比较方法,所有待排序的类都必须实现该方法,排序函数通过调用该方法,实现排序功能,比如C#中的IComparable(或ICompare<T>)接口,接口中定义了一个“int CompareTo(object obj)”(或“int CompareTo(T obj)”)方法,该方法用来定义排序规则。

另一种思路是:接口中定义一个比较方法,然后另外定义一个类(称为辅助类),由辅助类实现接口中的方法,排序函数通过辅助类的某个实例作为参数得到排序规则,比如C#中的System.Collections.Icompare接口(或System.Collections.Generic.Icomparer<T>接口),接口中定义了int Compare(object/T,object/T)方法,用来定义排序规则。

C#中的System.Array具有排序功能,内有名为Sort的排序函数,如:

public static void Sort(Array array);//要求数组元素实现IComparable接口

public static void Sort<T>(T[] array);//要求数组元素实现ICompare<T>接口

还有如:

public static void Sort(Array array, IComparer comparer);//辅助类实现IComparer接口

public static void Sort<T>(T[] array, IComparer<T> comparer);//辅助类实现Icomparer<T>接口

通过委托来实现也有两种思路

       和使用接口类似,一种思路定义一个委托,然后要求待排序的对象实现该委托实例,另一种思路是定义一个辅助委托,定义一个该委托的实例作为排序函数的一个参数。这里不再赘述,道理很简单,下面同样列举一个C#中的实例:

       .NET系统定义了一个名为System.Comparison<T>委托,其定义形式如下:

       Public delegage int System.Comparison<T>(T x,T y);

       利用该委托实现排序功能的是我们经常用到的List<T>集合类(当然List也可以利用接口实现排序,他有很多重载方法),List中有一个public void Sort(Comparison<T> comparison);排序方法用到了该委托。这是委托的第二种思路的实现,我们可以自己对第一种思路进行实验,很简单。

总结

读者朋友可能会产生疑问,既然微软都定义好了这么多方法了,你还自己定义什么排序函数啊,直接拿过来用不就是了,当然大多数情况下我们完全可以直接利用这些方法,上面的Array可以对静态数组进行排序,List可以对动态链表进行排序,看上去足够用了。但是有一个原因需要我们去考虑,那就是算法,微软在.NET中使用的快速排序算法(这个算法有点儿不稳定,当某些元素具有相同的值时,该算法不能保证这些元素会保持最初的顺序),但是排序算法有很多种,根据实际情况我们可能需要应用自己的算法,这样能够对所开发的项目更有利。希望这篇文章对你有用!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值