Array.Sort 是排序的方法,那么这个方法有多个重载版本, 多达16个,其中很多自定义的排序办法都离不开使用IComparer接口. 也就说,如果要实现自定义排序方法,让Array.Sort可以排序我们自定义的数据类型,那么这个我们自定义的数据类型,就要实现IComparer接口.
首先我定义个结构,然后再定义一个这个结构的数组.
public struct pass_data
{
public byte hua;
public byte data;
}
public pass_data [] tmp = new pass_data[10];
定义后,我们假设tmp这个结构数组都进行了不同的赋值.
那么这个结构就是我想排序的数据类型,如果直接用Array.Sort(tmp); 是肯定不行的,因为他无法知道tmp数组里的排序规则,因为你没告诉人家. 你想怎么排序,通过hua这个变量排,还是通过data这个变量排序.
好,我们来写一个继承IComparer接口的类
public class pass_sort : IComparer
{
int IComparer.Compare(object a, object b)
{
pass_data p1 = (pass_data)a;
pass_data p2 = (pass_data)b;
if (p1.data > p2.data)
return 1;
if (p1.data < p2.data)
return -1;
else
return 0;
}
public static IComparer sortPass()
{
return (IComparer)new pass_sort();
}
}
这个类首先要实现IComparer.Compare这个方法,这个办法的返回值是
小于零 | x 小于 y。 |
零 | x 等于 y。 |
大于零 | x 大于 y。 |
sortPass() 方法是返回IComparer类型的一个实例
那么我怎么使用这个自定义的类来排序呢
Array.Sort(tmp, pass_sort.sortPass());
第一个参数是数组,当然里面都是pass_data结构数据类型,第二个传递的参数就是实现了IComparea.Compare方法的实例.运行后,tmp排序成我们需要的结构数组.
我们分析一下,为什么Array.Sort这个重载方法需要第二个参数. 他们是具体怎么工作的
Array.Sort 并不知道你要排序的数据类型,也不知道你要排序的规则.那么他就要先定义个规则,这就是IComparea接口这个接口里面并没有什么具体内容,只是定义了一个成员,那就是Compare方法,当然这个方法也没有具体内容,只是定义了方法名和参数.没有具体的实现. 在Array.Sort里它会去调用实现Icomparea接口的实例方法Comparer,然后获得返回值,当然这个返回值是固定的,Array.Sort也不是神仙.但是他知道你只返回这三种结果.<0,>0,=0,那么他要做的就是把要比较的树组元素传递给你的Comparer方法...其他的我们没必要去了解了.
这么说不但说了自定义排序的使用和实现. 还简单的说明了接口的用处.当然接口无非就是把方法抽象了.