自定义排序 IComparer.Compare

来源:互联网 发布:linux下启动jar 编辑:程序博客网 时间:2024/06/06 01:13

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方法...其他的我们没必要去了解了.

这么说不但说了自定义排序的使用和实现. 还简单的说明了接口的用处.当然接口无非就是把方法抽象了.

原创粉丝点击