如何使用iComparable compareTo方法对该数组进行排序?

时间:2019-04-14 06:15:02

标签: c#

我必须比较一组不同的学生,以便得出以下结果:

Bloggs,John(工程学学士)等级:6
史密斯·约翰(工程学学士)等级:6
John,Bloggs,工程学学士学位:7
约翰·史密斯(工程学学士)等级:7
约翰·布洛格斯(IT学士)成绩:6
史密斯·约翰(IT学士)成绩:6
约翰·布洛格斯(IT学士)成绩:7
史密斯·约翰(IT学士)成绩:7
Bloggs,Jane(工程学学士)等级:6
Smith,Jane(工程学学士)等级:6
Bloggs,Jane(工程学学士)等级:7
Smith,Jane(工程学学士)等级:7
Bloggs,Jane(IT学士)成绩:6
Smith,Jane(IT学士)等级:6
Bloggs,Jane(IT学士)成绩:7
Smith,Jane(IT学士)等级:7

我的输出与此类似,但是我需要它从下至上进行比较。

我不能使用array.Reverse方法,因为我的代码的主要方法不会被调用。我需要我的compareTo方法对此进行排序,以便获得以下结果:

名字按降序排列,后跟... 学位按升序排列,其次是... 升序排列,然后... 姓氏升序。

main方法运行一个数组。排序

我尝试几次重新排列我的compareTo()方法,但不会将这些值按正确的顺序放置。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace StudentGradeOrder
{
    class Student : IComparable
    {

        private string firstName;
        private string lastName;
        private string degree;
        private int grade;

        /*Implementation of Parameterized constructor */
        public Student(string firstName, string lastName, string degree, int grade)
        {
            this.firstName = firstName;
            this.lastName = lastName;
            this.degree = degree;
            this.grade = grade;

        }

        /*Implementation of ToString method */
        public override string ToString()
        {
            return String.Format("{0} , {1}, {2} Grade {3}", lastName, firstName, degree, grade);
        }

        /*Implementation of CompareTo method */
        public int CompareTo(object obj)
        {

            Student studentObject = (Student)obj;

            var firstnameofStudent = studentObject.firstName.CompareTo(firstName);
            if (firstnameofStudent == 0)
            {
                var degreeValue = studentObject.degree.CompareTo(degree);
                if (degreeValue == 0)
                {
                    var gradeValue = studentObject.grade.CompareTo(grade);
                    if (gradeValue == 0)
                    {
                        var lastnameofStudent = studentObject.lastName.CompareTo(lastName);
                        if (lastnameofStudent == 0)

                            return lastnameofStudent;
                    }
                    return gradeValue;
                }
                return degreeValue;
            }
            return firstnameofStudent;
        }

2 个答案:

答案 0 :(得分:0)

我可以在这里看到两个错误: 1.返回firstnameofStudent时,应将其乘以-1以实现降序 2.无需在返回之前将lastnameofStudent与0进行比较,您无需进行进一步的字段比较

答案 1 :(得分:0)

如果您只想颠倒顺序,则可以包装CompareTo方法并返回颠倒的结果。

  1. CompareTo重命名为其他名称,例如InternalCompareTo

  2. 实施新的CompareTo方法,该方法返回相反的结果:

    public int CompareTo(object obj)
    {
        var result = InternalCompareTo(obj)
        if(result > 0)
            return -1;
        else if(result < 0)
            return 1;
        return 0;
    }