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);
}
}运行结果如下所示。空白行的前边是分科排名,后边是总分排名。
