c# 使用 IComparable 接口对数组进行排序
c# Sorting an array with IComparable Interface
我有一个包含 5 个作业的 jobArray 数组,其中包含一个 description
、hours needed to complete
和一个 hourly pay that a user enters
。
我需要在打印时按总费用的升序对数组进行排序(hours * hourly pay)
。
作业要求我在这样做时使用 IComparable interface
,但我不确定如何使用它。任何帮助将不胜感激,谢谢
这是我的job
class
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;
}
当 total fees
打印出来时,我不确定如何对 jobs
进行排序。
当您覆盖 "compareTo" 方法时,如果您调用 "sort",则会自动调用覆盖的方法。
这是微软的一个很好的数组示例。
https://support.microsoft.com/en-us/kb/320727
下面是"LIST"
的一个例子(伪代码)
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();
尝试如下给出的 CompareTo 函数:
public int CompareTo(object obj)
{
job tempList = (job)obj;
return tempList.totalFee.CompareTo(totalFee);
}
然后调用你的方法。
list.Sort()
这是您的代码的工作版本:
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
classCompareTo
,而不是对象 class。
另请注意,我使用了通用版本 IComparable<Job>
,而不是 IComparable
,以避免不必要的类型转换
我有一个包含 5 个作业的 jobArray 数组,其中包含一个 description
、hours needed to complete
和一个 hourly pay that a user enters
。
我需要在打印时按总费用的升序对数组进行排序(hours * hourly pay)
。
作业要求我在这样做时使用 IComparable interface
,但我不确定如何使用它。任何帮助将不胜感激,谢谢
这是我的job
class
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;
}
当 total fees
打印出来时,我不确定如何对 jobs
进行排序。
当您覆盖 "compareTo" 方法时,如果您调用 "sort",则会自动调用覆盖的方法。
这是微软的一个很好的数组示例。 https://support.microsoft.com/en-us/kb/320727
下面是"LIST"
的一个例子(伪代码)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();
尝试如下给出的 CompareTo 函数:
public int CompareTo(object obj)
{
job tempList = (job)obj;
return tempList.totalFee.CompareTo(totalFee);
}
然后调用你的方法。
list.Sort()
这是您的代码的工作版本:
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
classCompareTo
,而不是对象 class。
另请注意,我使用了通用版本 IComparable<Job>
,而不是 IComparable
,以避免不必要的类型转换