using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Collections;public partial class _Default : System.Web.UI.Page 
{
    protected void Page_Load(object sender, EventArgs e)
    {
        ArrayList arr1 = new ArrayList();        //循环添加元素1~5
        for (int i = 1; i < 6; i++) //arr1:{1,2,3,4,5}
            arr1.Add(i);        //使用逆比较策略,实现逆排序
        IComparer myComparer = new myReverserClass();
        arr1.Sort(myComparer); //        //输出
        int j = 0;
        foreach (int item in arr1)
        {
            Page.Response.Write("[  " + j + "  ]: " + item + "<br />");
            j++;
        }
    }    public class myReverserClass : IComparer
    {        /// <summary>
        /// 实现比较接口,采取逆比较策略
        /// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <returns></returns>
        int IComparer.Compare(Object x, Object y)///a.想知道x,y的具体含义
        {
            if (Convert.ToInt32(x) > Convert.ToInt32(y))
                return -1;
            else if (Convert.ToInt32(x) == Convert.ToInt32(y))
                return 0;
            else
                return 1;
        }    }
}1.a处的,object x,y 的具体指代是啥?
2.if else if 的里面的代码的具体含义是啥? return -1,0,1分别是啥意思。

解决方案 »

  1.   

    x要比较的第一个对象。 
    y要比较的第二个对象。
    -1:x<y,即把y排到x后
    0:x=y,两者位置不变
    1:x>y,把x排到y后
      

  2.   

    IComparer.Compare 方法:比较两个对象并返回一个值,指示一个对象是小于、等于还是大于另一个对象。int Compare(Object x,Object y)
    参数
    x
    类型:System.Object要比较的第一个对象。 y
    类型:System.Object要比较的第二个对象。 返回值
    类型:System.Int32值 
     条件 
     
    小于零 
     x 小于 y。 
     
    零 
     x 等于 y。 
     
    大于零 
     x 大于 y。 
      

  3.   

    IComparer
    IComparer 的作用是提供其他比较机制。 。 
    使用 IComparer 是两步过程。 首先,声明一个实现 IComparer ,类,然后实现 Compare 方法: 
    private class sortYearAscendingHelper : IComparer
    {
    int IComparer.Compare(object a, object b)
    {
    car c1=(car)a;
    car c2=(car)b;
    if (c1.year > c2.year)
    return 1;
    if (c1.year < c2.year)
    return -1;
    else
    return 0;
    }
    }
    根据值是否大于、 等于,或小于另返回 IComparer.Compare
      

  4.   

    自定义排序 IComparer.Compare 收藏
    Asp.net 2.0Array.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方法...其他的我们没必要去了解了.这么说不但说了自定义排序的使用和实现. 还简单的说明了接口的用处.当然接口无非就是把方法抽象了.
      

  5.   

            int IComparer.Compare(Object x, Object y)///a.想知道x,y的具体含义
            {
                if (Convert.ToInt32(x) > Convert.ToInt32(y))
                    return -1;
                else if (Convert.ToInt32(x) == Convert.ToInt32(y))
                    return 0;
                else
                    return 1;
            }这里X,Y分别指的是第一个比较的数及被比较的数由于这个接口的扩充性能比较好  所以两个比较的数据类型都是object的根数据类型可以进行任何的C#支持的数据类型 及 自定义的类 的类型等由于这里比较的是两个整数  所以要把object的数据类型强制转换为int32
    Convert.ToInt32(x) > Convert.ToInt32(y)

    -1 表示第一个数想x小于第二个数y
    0 表示第一个数想x等于第二个数y
    1 表示第一个数想x大于第二个数y
      

  6.   


    if (Convert.ToInt32(x) > Convert.ToInt32(y))
                    return -1;
    上面代码不是说 x>y,返回-1么?-1的意思是把y排到x的后面?
    另外,x,y是按什么顺序取arr1里面的值的呢?偶想知道。谢谢。