C# 自定义类型排序
在编写程序处理数据时经常需要对自己组织的数据进行排序,有时还是不同形式的排序,在C++中可以自定义结构体重载bool operator<()
函数,也可以自己写int compare()
。而在C#中自定义排序,就需要对类的IComparer<>
接口进行实现,排序时调用Sort()方法时将实现的排序接口作为参数传入即可。
假定现在有一组学生的三门课成绩
class student { public int score1; public int score2; public int score3; }
接下来分别实现对学生的成绩分科排序和总分排序。
分科排序是指:先按score1由小到大排,若score1一样则按score2由小到大排,否则按score3由小到大。
总分排序就是按照学生三科成绩之和由小到大排。
使用随机数生成N个学生的分数,并保存在List<student> a
当中
private static void Main() { List<student> a = new List<student>(); Random rd = new Random(); const int N=15; for(int i=0;i<N;i++) { student s1 = new student(); s1.score1 = rd.Next(0,100); s1.score2 = rd.Next(0,100); s1.score3 = rd.Next(0,100); a.Add(s1); } ... }
先实现分科排序,创建名为score123Rank
的类继承IComparer<student>
接口,主要是实现其int Compare()
函数,实现分科排序的功能。
class score123Rank : IComparer<student> { public int Compare(student x, student y) { try { if(x.score1!=y.score1) return x.score1 - y.score1; else if(x.score2!=y.score2) return x.score2 - y.score2; else return x.score3 - y.score3; } catch { throw new NotImplementedException(); } } }
这样,在主函数中只需要调用a.Sort(new score123Rank())
就完成了排序。输出排序后的结果看一下:
a.Sort(new score123Rank()); for(int i=0;i<N;i++) { Console.WriteLine("{0}\t{1}\t{2}", a[i].score1,a[i].score2,a[i].score3); }
类似地,再编写总分排序的类totalRank
。
class totalRank : IComparer<student> { public int Compare(student x ,student y) { try { return (x.score1+x.score2+x.score3) -(y.score1+y.score2+y.score3); } catch { throw new NotImplementedException(); } } }
这样再调用a.Sort(new totalRank())
就对a中按照总分进行了排序。
完整Main函数为
private static void Main() { List<student> a = new List<student>(); Random rd = new Random(); const int N=15; for(int i=0;i<N;i++) { student s1 = new student(); s1.score1 = rd.Next(0,100); s1.score2 = rd.Next(0,100); s1.score3 = rd.Next(0,100); a.Add(s1); } a.Sort(new score123Rank()); for(int i=0;i<N;i++) { Console.WriteLine("{0}\t{1}\t{2}", a[i].score1,a[i].score2,a[i].score3); } Console.WriteLine(); a.Sort(new totalRank()); for(int i=0;i<N;i++) { Console.WriteLine("{0}\t{1}\t{2}", a[i].score1,a[i].score2,a[i].score3); } }
运行结果如下所示。空白行的前边是分科排名,后边是总分排名。