C# 自定义类型排序

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);
    }

}

运行结果如下所示。空白行的前边是分科排名,后边是总分排名。

发表评论

电子邮件地址不会被公开。 必填项已用*标注