#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
метод и вернуть обратный результат.
-
Переименовать
CompareTo
на другое имя, напримерInternalCompareTo
-
Реализовать новый
CompareTo
метод, который возвращает обратный результат:public int CompareTo(object obj) { var result = InternalCompareTo(obj) if(result > 0) return -1; else if(result < 0) return 1; return 0; }