#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()