问题在这句话arr.Sort(new StudentComparer(StudentComparer.CompareType.Grade)); 
这里只是向sort中传了一个实现了IComparer<Student>的对象,并没有调用该对象的Compare方法啊,就算可以自动调用,也没有指明那个对象是x,那个对象是Y啊,怎么比较呢??详细代码如下:
using System;
using System.Collections.Generic;
/// <summary>
/// 学生类
/// </summary>
public class Student 
{
    private string name;
    // 姓名
    public string Name
    {
        get { return name; }
        set { name = value; }
    }
    private int age;
    // 年龄
    public int Age
    {
        get { return age; }
        set { age = value; }
    }    private string grade;
    // 年级
    public string Grade
    {
        get { return grade; }
        set { grade = value; }
    }
    //构造函数 
    public Student(string name, int age, string grade)
    {
        this.name = name;
        this.age = age;
        this.grade = grade;
    }
    public override string ToString()
    {
        return this.name + "," + this.age.ToString() + "," + this.grade;
    }
}接着定义一个用于比较的类,实现IComparer<T>泛型接口:
public class StudentComparer : IComparer<Student>
{
    public enum CompareType
    {
        Name,
        Age,
        Grade
    }    private CompareType type;
    // 构造函数,根据type的值,判断按哪个字段排序
    public StudentComparer(CompareType type)
    {
        this.type = type;
    }    #region IComparer<Student> 成员
    public int Compare(Student x, Student y)
    {
        switch(this.type)
        {
            case CompareType.Name:
                return x.Name.CompareTo(y.Name);
            case CompareType.Age:
                return x.Age.CompareTo(y.Age);
            default://case CompareType.Grade:
                return x.Grade.CompareTo(y.Grade);
        }
    }    #endregion
}下面就开始排序了:
using System;
using System.Collections.Generic;
public class test
{
    public static void Main()
    {
        List<Student> arr = new List<Student>();
        arr.Add(new Student("张三", 7, "一年级"));
        arr.Add(new Student("李四", 11, "二年级"));
        arr.Add(new Student("王五", 21, "一年级"));
        arr.Add(new Student("陈六", 8, "三年级"));
        arr.Add(new Student("刘七", 15, "二年级"));
        
        // 调用Sort方法,实现按年级排序
        arr.Sort(new StudentComparer(StudentComparer.CompareType.Grade));        
        // 循环显示集合里的元素
        foreach( Student item in arr)
            Console.WriteLine(item.ToString());         // 调用Sort方法,实现按姓名排序
        arr.Sort(new StudentComparer(StudentComparer.CompareType.Name));             
        // 循环显示集合里的元素
        foreach( Student item in arr)
            Console.WriteLine(item.ToString()); 
    }
}

解决方案 »

  1.   

    怎么会没有调用???MSDN:List(T).Sort 方法 (IComparer(T))
    使用指定的比较器对整个 List(T) 中的元素进行排序。备注 
    如果提供了 comparer,则 List(T) 的元素是使用指定的 IComparer(T) 实现进行排序的。
      

  2.   

    IComparer <Student>对象用来说明两个Student谁大谁小,
    Sort方法在排序的时候肯定要比较Student大小,这个时候就会自动调用这个对象来比较
      

  3.   

    sort方法是快速排序,X,Y已经定好了,不管你用不用IComparer
      

  4.   

    x.Name.CompareTo(y...)
    根据x升序
    y......x
    根据y升序
      

  5.   

    修改Compare的函数如下,就知道其实是调用了。
    #region IComparer<Student> 成员
        public int Compare(Student x, Student y)
        {
            Console.WriteLine("Invoke: {0} : {1};", x, y);
            switch(this.type)
            {
                case CompareType.Name:
                    return x.Name.CompareTo(y.Name);
                case CompareType.Age:
                    return x.Age.CompareTo(y.Age);
                default://case CompareType.Grade:
                    return x.Grade.CompareTo(y.Grade);
            }
        }    #endregion
    没有指明那个对象是x,那个对象是Y啊,怎么比较呢?
    你没有必要关心调用时哪个是x,哪个是y.
    这个函数做的事情就是比较x,y,如果x>y,返回1, 如果x==y, 返回0, 如果x<y, 返回-1。
    这个接口其实就是让你自己定义两个学生之间的比较规则。
      

  6.   

    这里只是向sort中传了一个实现了IComparer <Student>的对象,并没有调用该对象的Compare方法啊,就算可以自动调用,也没有指明那个对象是x,那个对象是Y啊,怎么比较呢?? 
    -----------------------------
    这个工作是在sort 内部 实现的
      

  7.   

    当List<T>.Sort执行时,当要比较两个数据的大小时,就会去调用public int Compare(Student x, Student y)
    它将Compare的事情委托给了IComparer<T>.Compare方法你可以在public int Compare(Student x, Student y)方法里下断点,Debug一下,这样可以看得比较清楚