您的位置:首页 > 其它

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

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

一种思路是:接口中定义一个比较方法,所有待排序的类都必须实现该方法,排序函数通过调用该方法,实现排序功能,比如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中使用的快速排序算法(这个算法有点儿不稳定,当某些元素具有相同的值时,该算法不能保证这些元素会保持最初的顺序),但是排序算法有很多种,根据实际情况我们可能需要应用自己的算法,这样能够对所开发的项目更有利。希望这篇文章对你有用!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐