Как я могу отсортировать этот массив с помощью метода IComparable compareTo?

#c#

#c#

Вопрос:

Мне нужно сравнить массив разных учеников, чтобы он выдавал:

Блоггс, Джон (бакалавр технических наук) Оценка: 6
Смит, Джон (бакалавр технических наук) Оценка: 6
Блоггс, Джон (бакалавр технических наук) Оценка: 7
Смит, Джон (бакалавр технических наук) Оценка: 7
Блоггс, Джон (бакалавр ИТ) Оценка: 6
Смит, Джон (бакалавриз ИТ) Оценка:
6 блогов, Джон (бакалавр ИТ) Оценка: 7
Смит, Джон (бакалавр ИТ) Оценка:
7 блогов, Джейн (бакалавр инженерных наук) Оценка: 6
Смит, Джейн (бакалавр инженерных наук) Оценка:
6 блогов, Джейн (бакалавр инженерных наук) Оценка:7
Смит, Джейн (бакалавр инженерных наук) Оценка:
7 блогов, Джейн (бакалавр ИТ) Оценка: 6
Смит, Джейн (бакалавр ИТ) Оценка:
6 Блогов, Джейн (бакалавр ИТ) Оценка: 7
Смит, Джейн (бакалавр ИТ) Оценка: 7

Мой вывод похож на этот, но мне нужно, чтобы он сравнивал его снизу вверх.

Я не могу использовать массив.Обратный метод в качестве основного метода моего кода вызываться не будет. Мне нужен мой метод compareTo для сортировки этого, чтобы я получил эти результаты:

Сначала имена в порядке убывания, затем… Степени в порядке возрастания, за которыми следует… Оценки в порядке возрастания, за которыми следует… Фамилии в порядке возрастания.

Основной метод запускает array.Sort

Я несколько раз пытался изменить свой метод 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;
        }
  

Комментарии:

1. Реализовать средство сравнения проще, гибче и эффективнее, чем реализовать интерфейс IComparable.

Ответ №1:

Здесь я вижу две ошибки: 1. При возврате firstnameofStudent его следует умножить на -1, чтобы получить порядок убывания 2. Нет необходимости сравнивать lastnameofStudent с 0 перед возвратом, у вас нет дальнейшего сравнения полей

Ответ №2:

Если вам просто нужен обратный порядок, вы можете обернуть 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;
    }