C# 对象集合如何排序 (根据课程成绩grade将学生进行排序)

文章介绍如何通过实现IComparable接口对包含成绩的学生类对象进行排序。代码示例中,学生类实现了IComparable,根据成绩进行比较,然后使用Array.Sort进行排序,展示了对象集合排序的实现方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、功能说明

  构造一个学生类,其中包括成绩、科目和学号,请根据课程成绩grade将学生进行由小到大的排序。

二、设计流程

  先构造一个学生类,针对该对象本身实现IComparable接口,根据当前学生与需比较学生的进行大小比较,若当前学生成绩大于要比较学生成绩则返回-1,若当前学生成绩小于要比较学生成绩则返回1,若相等则返回0,通过返回值反映大小关系。

三、关键源码展示

学生类

public class Student : IComparable
{
    public double mygrade;
    public string mysubject, myID;
    public Student() { }
    public Student(double grade, string subject, string id)
    {
        mygrade = grade;
        mysubject = subject;
        myID = id;
    }
    int IComparable.CompareTo(Object obj)
    {
        if(obj is Student)
        {
            Student s = (Student)obj;
            if(this.mygrade > s.mygrade)
            {
                return 1;
            }
            else if(this.mygrade < s.mygrade)
            {
                return -1;
            }
            else
            {
                return 0;
            }
        }
        throw new ArgumentException("object is not a Student");
    }
}

主函数

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);
        foreach(Student student in students)
        {
            Console.WriteLine(student.mygrade + "," + student.mysubject + "," + student.myID);
        }
    }

运行结果

 

四、总结

  对于对象集合如何排序问题,在使用IComparable接口时,必须保证至少具有一个CompareTo()成员,IComparable接口本身就是为了根据业务需求,统一对象某一属性的比较,通过返回-1,1,0来反映大小,在解决此类问题上大大方便了任意比较一个类中的两个对象。

五、源码开源地址

https://gitee.com/BlingQD_0/windows-job-w/blob/master/Program.cs

学生管理系统项目 一、系统目标 开发一个控制台程序实现以下核心功能 1、管理不同类型学生的基本信息 2、实现差异化的成绩计算方式 3、提供标准化的信息展示格式 4、支持扩展新的学生类型 二、核心功能要求 1. 学生类型管理 必须支持至少2种学生类别(如本科生/研究生) 每种类型需具备: 专属身份标识(如学号格式差异) 特有属性字段(如专业/研究方向) 个性化信息展示方式 2. 信息管理功能 添加学生:支持通过控制台输入不同类别学生信息 查询学生:能根据唯一标识检索学生详细信息 显示全部:按统一格式列出所有学生基本信息 成绩计算:不同学生类型采用不同的GPA计算规则 3. 系统交互规范 [控制台界面要求] 1. 采用数字菜单导航 2. 输入错误时有友好提示 3. 关键操作提供确认机制 信息显示格式 ● 本科生:[类型标识] 学号 | 姓名 | 年龄 | 专业 ● 研究生:[类型标识] 学号 | 姓名 | 年龄 | 研究方向 三、技术要求 必须实现的编程特性: 通过方法重写实现差异化的信息展示 使用父类集合管理所有学生对象 实现至少1个标准化能力接口 包含2个以上抽象层级 所有属性访问必须通过公共方法 禁止实现方式: 使用条件语句判断学生类型执行不同逻辑 重复定义相同功能的显示方法 硬编码学生数据(测试数据除外) 四、运行示例 场景1:查看所有学生 text === 当前注册学生 === [UG] 2023001 | 王小明 | 19 | 计算机科学与技术 [PG] 2023P001 | 李雨桐 | 24 | 人工智能伦理 [UG] 2023002 | 张伟强 | 20 | 电子工程 场景2:查询学生详情 text 输入查询学号:2023P001 [研究生详情] 学号:2023P001 姓名:李雨桐 年龄:24 研究领域:人工智能伦理 学分状态:已修32学分 论文进度:开题通过 场景3:成绩计算演示 text 选择操作:计算GPA 输入学号:2023001 正在计算本科生GPA... 课程权重:4.0制计算法 当前GPA:3.68 场景4:添加新学生 text 请选择学生类型: 1. 本科生 2. 研究生 > 1 请输入学生信息: 学号:2023003 姓名:陈思思 年龄:18 专业:工商管理 [新学生添加成功] 五、扩展挑战(可选) 实现学生状态跟踪(在读/休学/毕业) 添加课程管理系统(选课/成绩录入) 支持数据文件存储与读取 实现多维度数据统计(年龄分布/专业比例) 开发成绩预警系统(挂科提醒/GPA预警) 建立权限管理系统(管理员/学生不同视图) 六、质量评估标准 1、除学号、姓名、年龄、专业等内容可以通过单纯输入实现,其余涉及到课程内容(例如:学分、GPA)的内容不能由程序员自行设定,需通过计算实现。具体的计算标准自行决定,且需要在报告中说明。 2、需要提交: (1)源码 (2)UML图 (3)报告(包括项目已实现内容且配备运行成功截图、学分以及GPA的运算逻辑、功能实现涉及的知识点和核心代码) 3、评分标准 60以下:提交内容不全、完全不能实现任何功能 60-70:实现查看所有学生 70-80:实现查询学生详情(包括学分)或计算GPA 80-90:实现四项功能 90-100:实现拓展功能
最新发布
06-05
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值