c # Сортировка массива с помощью интерфейса IComparable

#c# #arrays #icomparable

#c# #массивы #icomparable

Вопрос:

У меня есть массив jobArray с 5 заданиями, которые содержат a description , hours needed to complete , и an hourly pay that a user enters .

Мне нужно отсортировать массив при печати в порядке возрастания общей платы (hours * hourly pay) .

Назначение требует, чтобы я использовал IComparable interface при этом, но я не уверен, как его использовать. Любая помощь будет оценена, спасибо

Вот мой job класс

 class Job : IComparable
{

    public Job(string description, int hours, double hourRate, double fee)
    {
        Description = description;
        hoursToComplete = hoursToComplete;
        hourlyRate = hourlyRate;
        totalFee = totalFee;

    }
  

Это интерфейс, который я сделал для сравнения totalFees

     public int CompareTo(Job o)
    {
        int returnVal;
        Job temp = (Job)o;
        if (this.totalFee > temp.totalFee)
            returnVal = 1;
        else
            if (this.totalFee < temp.totalFee)
                returnVal = -1;
            else
                returnVal = 0;
        return returnVal;

    }
  

Я не уверен, что делать отсюда, чтобы сортировать jobs , когда они распечатываются total fees .

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

1. Я думаю, вы все сделали правильно. Теперь просто добавьте объекты этого класса в список и используйте метод sort().

2. Ваш код не будет компилироваться. В вашем коде есть ряд очевидных ошибок, которые не имеют ничего общего с IComparable или сортировкой. Вы должны сначала попытаться исправить это, прежде чем пытаться сделать что-то более сложное.

Ответ №1:

При переопределении метода «compareTo» и при вызове «sort» автоматически вызывается переопределенный метод.

Вот хороший пример от Microsoft для массивов. https://support.microsoft.com/en-us/kb/320727

Ниже приведен пример (псевдокод) «СПИСКА»

 List<Job> list = new List<Job>();

list.Add(new Job() { //Intialize arguments });
list.Add(new Job() { //Intialize arguments });
list.Add(new Job() { //Intialize arguments });
list.Add(new Job() { //Intialize arguments });
list.Add(new Job() { //Intialize arguments });

// Uses IComparable.CompareTo()
list.Sort();
  

Ответ №2:

Вот рабочая версия вашего кода:

 class Job : IComparable<Job>
{
    public string Description { get; set;}

    public int HoursToComplete { get; set;}

    public double HourlyRate { get; set;}

    public double TotalFee { get; set;}

    public Job(string description, 
               int hoursToComplete, 
               double hourlyRate, 
               double totalFee)
    {
        Description = description;
        HoursToComplete = hoursToComplete;
        HourlyRate = hourlyRate;
        TotalFee = totalFee;
    }

    public int CompareTo(Job otherJob)
    {
        int returnVal;

        if (this.TotalFee > otherJob.TotalFee)
            returnVal = 1;
        else
            if (this.TotalFee < otherJob.TotalFee)
            returnVal = -1;
        else
            returnVal = 0;

        return returnVal;
    }
}
  

Теперь, поскольку вы реализовали IComparable<Job> , то по данному List<Job> , просто вызовите Sort , который автоматически вызовет Job class CompareTo , а не object class .
Также обратите внимание, что я использовал общую версию IComparable<Job> вместо IComparable , чтобы избежать ненужного приведения типов

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

1. Спасибо. буду ли я вызывать его при распечатке массива? когда я пытаюсь позвонить. сортировка не отображается в intellisense.

2. Вызовите ArrayObject.ToList() , затем вызовите Sort список

3. Вы можете упростить compareTo до однострочного. return this.TotalFee - otherJob.TotalFee

4. В этом случае true, но не будет работать должным образом во всех случаях, когда задействовано несколько полей, поэтому используется стандартная нотация сравнения, модифицирующая операционный код. Тем не менее, спасибо

Ответ №3:

Попробуйте функцию compareTo, как указано ниже:

 public int CompareTo(object obj)
{
     job tempList = (job)obj;
     return tempList.totalFee.CompareTo(totalFee);
}
  

Затем вызовите свой метод.

 list.Sort()