using System;
using System.Collections.Generic;
using System.Text;namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Student [] students=new Student [5];
            students[0]=new Student ("王小红",20,1);
            students[1]=new Student ("周军",23,2);
            students[2]=new Student ("方小白",21,2);
            students[3]=new Student ("高强",25,3);
            students[4]=new Student ("王浩",22,3);
            Student .CompareFunction compare;
            Console .WriteLine ("请选择排序方式:A姓名  B年龄  C年级");
            char ch =Console .ReadKey ().KeyChar ;
            if (ch =='B'||ch=='b')
                compare =CompareAge ;
            else if (ch =='C'||ch =='c')
                compare =CompareGrade ;
            else 
                compare =CompareName ;
            Student .SortAndPrint (students,compare );           
        }
        static int CompareName(Student s1, Student s2)
        {
            return 0 - s1.Name.CompareTo(s2.Name);
        }
        static int CompareAge(Student s1, Student s2)
        {
            return s1.Age - s2.Age;
        }
        static int CompareGrade(Student s1, Student s2)
        {
            return s1.Grade - s2.Grade;
        }
    }
    public class Student
    {
        private string name;
        public string Name
        {
            get { return name; }
        }        private int age;
        public int Age
        {
            get { return age; }
        }        private int grade;
        public int Grade
        {
            get { return grade; }
            set { grade = value; }
        }        public Student(string name, int age, int grade)
        {
            this.name = name;
            this.age = age;
            this.grade = grade;
        }
        public static void SortAndPrint(Student[] students, ComparerFunction compare)
        {
            for (int i=students .Length -1;i>0;i--)
                for (int j=0;j<i;j++)
                    if (compare(students[j], students[j + 1]) > 0)
                    {
                        Student s = students[j];
                        students[j] = students[j + 1];
                        students[j + 1] = s;
                    }
            foreach (Student s in students)
                Console.WriteLine(s);        }
        public override string ToString()
        {            return string.Format("{0}{1}岁 {2}年级", name, age, grade);        }
        public delegate int CompareFunction(Student s1, Student s2);
    }
}

添加多重排序功能,即若姓名相同就按年龄排序,若姓名年龄都相同了就按年级排序

解决方案 »

  1.   

    SQL order by实现不是更好么?
      

  2.   

    ling to system 也可以,去虚拟表在内存用数据库查询机制进行排版
      

  3.   

    DataTable类会用吗?那个自带排序功能的。
      

  4.   

    List<T>.Sort(IComparer<T>)
    public class StudentComparer : IComparer<Student>
    {
        public enum CompareType
        {
            Name,
            Age,
            Grade
        }
        private CompareType type;
        public StudentComparer(CompareType type)
        {
            this.type = type;
        }
        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:
                    return x.Grade.CompareTo(y.Grade);
            }
        }
    }
      

  5.   

    你好,能给我讲下,怎么样在DataTable中对字段进行多重排序吗
      

  6.   

    方法一:用DataTable.Select 方法,可以实现过滤和排序,返回排序后的DataRow数组。
    方法二:用DataTable.DefaultView获取DataView对象,然后使用DataView.Sort 属性排序,例如:
        DataView view = DataTable1.DefaultView;
        view.Sort = "State, ZipCode DESC";
      

  7.   

    额。。如果不用那些的话,用冒泡不就好了我是用年级、年龄、姓名这个顺序来排的,当然里面的大小的比较会有问题,我只是想表明一下这个思想而已,具体的大小比较你可以自己弄,反正就是这个思路,最后出来的students就是已经排好序的了。for(int i;i<students.Length;i++){
      if(i==students.Length-1)
         continue;
      if(studens[i].grade>students[i+1].grade){
         Student newStudent=students[i];
         students[i]=students[i+1];
         students[i+1]=newStudent;
      }else if(studens[i].grade=students[i+1].grade){
         if(studens[i].age>students[i+1].age){
            Student newStudent=students[i];
            students[i]=students[i+1];
            students[i+1]=newStudent;
         }else if(studens[i].age=students[i+1].age){
            if(studens[i].name>students[i+1].name){
               Student newStudent=students[i];
               students[i]=students[i+1];
               students[i+1]=newStudent;
            }
         }
      }
    }
      

  8.   

            static int CompareName(Student s1, Student s2) 
            { 
                return 0 - s1.Name.CompareTo(s2.Name); 
            } 
    改为:
            static int CompareName(Student s1, Student s2) 
            { 
                return s1.Name.CompareTo(s2.Name); 
            } 
      

  9.   

     if (ch =='B'||ch=='b') 
                    compare =CompareAge ; 
                else if (ch =='C'||ch =='c') 
                    compare =CompareGrade ; 
                else 
                    compare =CompareName ; 貌似你的委托只有绑定一个方法吧,这样只会进行一个条件的排列啊
    compare +=CompareAge ;
    compare +=CompareGrade ; 
    compare +=CompareName ;