目录
功能说明:
设计一个学生类,属性如下:考试成绩mygrade、考试课目和学号
根据课程成绩将学生对象集合进行了排序
(PS:据笔者所知,java与python的貌似集合不允许有重复元素,而CSharp允许)
设计流程:
下面为Student类内部的具体实现排序的逻辑
关键源码展示:
具体比较代码CompareTo,写在Student类内部
public int CompareTo(object obj)
{
if (obj is Student)
{
Student student = obj as Student;
//return mygrade.CompareTo(student.mygrade);此代码为默认排序方式,小的排在前面
//下面代码能把大的排在前面
if (this.mygrade > student.mygrade)
return -1;
else if (this.mygrade < student.mygrade)
return 1;
else
return 0;
}else
throw new ArgumentException("比较对象不是Student类");
}
主函数:
存储方式是对象数组,比较时直接调用Array.Sort并把对象数组传进去
internal class Program
{
private static void Main(string[] args)
{
Student[] students = new Student[5];
students[0] = new Student(50.0, "windows程序设计", "001");
students[1] = new Student(90.0, "windows程序设计", "002");
students[2] = new Student(100.0, "windows程序设计", "003");
students[3] = new Student(70.0, "windows程序设计", "004");
students[4] = new Student(80.0, "windows程序设计", "005");
//请在此处添加关键代码···
Array.Sort(students);
Console.WriteLine("下面是成绩由高到低排序:");
foreach (Student student in students)
{
Console.WriteLine("成绩:{0} 课程:{1} 学号: {2}",student.mygrade,student.mysubject,student.myID);
}
}
}
总结:
在引用类型(具有多个字段)排序时,我们可以继承IComparable接口,同时实现int CompareTo(object obj)方法,来实对对象的排序。
同时,return值为-1,0,1,具体含义如下
拓展:
避免拆箱装箱操作,IComparable支持泛型
相关代码可以修改为:
public class Student : IComparable<Student>
public int Compare(Student student)
实现效果截图:
源码开源地址: