使用 IComparable
Using IComparable
所以我在这个错误上画了一个空白。
无法比较数组中的两个元素。
Array.Sort(病人);是产生错误的地方。我确实有一个 IComparable 接口和一个包含以下代码的 class 文件:尝试按患者 ID 号排序
class Patient : IComparable
{
private int patientID;
private string patientName;
private int patientAge;
private decimal amount;
public int PatientId { get; set; }
public string PatientName { get; set; }
public int PatientAge { get; set; }
public decimal PatientAmount { get; set; }
int IComparable.CompareTo(Object o)
{
int value;
Patient temp = (Patient)o;
if (this.PatientId > temp.PatientId)
value = 1;
else if (this.PatientId < temp.PatientId)
value = -1;
else
value = 0;
return value;
}
}
这就是我的主要方法。没有添加 Display() 因为现在没有添加任何东西,为什么它被注释掉了
private static void Main(string[] args)
{
int numOfPatients =2 ;
Patient[] patient = new Patient[numOfPatients];
for (int x = 0; x < numOfPatients; x++)
{
int intvalue;
decimal dollarValue;
patient[x] = new Patient();
Console.Write("Patient {0}: ", (x + 1));
Console.WriteLine("Enter the Patients ID: ");
bool isNum = int.TryParse(Console.ReadLine(), out intvalue);
if (isNum)
{
patient[x].PatientId = intvalue;
}
else
{
Console.WriteLine("Patient ID was invalid. ID needs to be numbers");
Console.WriteLine("Enter the Patients ID: ");
int.TryParse(Console.ReadLine(), out intvalue);
}
Console.WriteLine("Enter the Patients Name: ");
patient[x].PatientName = Console.ReadLine();
Console.WriteLine("Enter the Patients Age: ");
bool isAge = int.TryParse(Console.ReadLine(), out intvalue);
if (isAge)
{
patient[x].PatientAge = intvalue;
}
else
{
Console.WriteLine("Patient Age was invalid. Age needs to be numbers");
Console.WriteLine("Enter the Patients Age: ");
int.TryParse(Console.ReadLine(), out intvalue);
}
Console.WriteLine("Enter the Patients Amount Due: ");
bool isAmount = Decimal.TryParse(Console.ReadLine(), out dollarValue);
if (isAmount)
{
patient[x].PatientAmount = dollarValue;
}
else
{
Console.WriteLine("Patient amount Due was invalid. Amount needs to be a numbers");
Console.WriteLine("Enter the Patients Amount Due: ");
int.TryParse(Console.ReadLine(), out intvalue);
}
}
Array.Sort(patient);
Console.WriteLine("Patients in order with Amounts Owed are: ");
for (int i = 0; i < patient.Length; ++i) ;
//Display(patient[i], numOfPatients);
我就写
return this.PatientId.CompareTo(temp.PatientId)
在覆盖的 CompareTo 方法中 class。无需使用等号。这将为您和 return 正确的值进行比较。
我还建议您只使用 IList class 的一些实现,然后您就可以使用 LinQ 语句了。使用它可以防止 "array"
中出现空值
我想到了一些事情:
a) 为什么不实施 IComparable<Patient>
?
b) 为什么要重新实现 int.CompareTo(int)
?您的 IComparable 实现可以只是 return this.PatientID.CompareTo(other.PatientID)
.
c) 您确定排序时数组已满吗?我不确定如果它包含 null
.
会发生什么
看起来如果 Array.Sort 与类型化数组一起传递将调用 Array.Sort<T>(T[])
重载。根据 MSDN documentation,此重载使用 IComparable<T>
接口来比较对象。所以看起来你有两个选择:
- 您可以实施
IComparable<T>
而不是 IComparable
(更好)。
- 您可以将数组转换为
Array
以调用使用 IComparable
接口的 Array.Sort(Array)
重载(更糟)。
所以我在这个错误上画了一个空白。 无法比较数组中的两个元素。 Array.Sort(病人);是产生错误的地方。我确实有一个 IComparable 接口和一个包含以下代码的 class 文件:尝试按患者 ID 号排序
class Patient : IComparable
{
private int patientID;
private string patientName;
private int patientAge;
private decimal amount;
public int PatientId { get; set; }
public string PatientName { get; set; }
public int PatientAge { get; set; }
public decimal PatientAmount { get; set; }
int IComparable.CompareTo(Object o)
{
int value;
Patient temp = (Patient)o;
if (this.PatientId > temp.PatientId)
value = 1;
else if (this.PatientId < temp.PatientId)
value = -1;
else
value = 0;
return value;
}
}
这就是我的主要方法。没有添加 Display() 因为现在没有添加任何东西,为什么它被注释掉了
private static void Main(string[] args)
{
int numOfPatients =2 ;
Patient[] patient = new Patient[numOfPatients];
for (int x = 0; x < numOfPatients; x++)
{
int intvalue;
decimal dollarValue;
patient[x] = new Patient();
Console.Write("Patient {0}: ", (x + 1));
Console.WriteLine("Enter the Patients ID: ");
bool isNum = int.TryParse(Console.ReadLine(), out intvalue);
if (isNum)
{
patient[x].PatientId = intvalue;
}
else
{
Console.WriteLine("Patient ID was invalid. ID needs to be numbers");
Console.WriteLine("Enter the Patients ID: ");
int.TryParse(Console.ReadLine(), out intvalue);
}
Console.WriteLine("Enter the Patients Name: ");
patient[x].PatientName = Console.ReadLine();
Console.WriteLine("Enter the Patients Age: ");
bool isAge = int.TryParse(Console.ReadLine(), out intvalue);
if (isAge)
{
patient[x].PatientAge = intvalue;
}
else
{
Console.WriteLine("Patient Age was invalid. Age needs to be numbers");
Console.WriteLine("Enter the Patients Age: ");
int.TryParse(Console.ReadLine(), out intvalue);
}
Console.WriteLine("Enter the Patients Amount Due: ");
bool isAmount = Decimal.TryParse(Console.ReadLine(), out dollarValue);
if (isAmount)
{
patient[x].PatientAmount = dollarValue;
}
else
{
Console.WriteLine("Patient amount Due was invalid. Amount needs to be a numbers");
Console.WriteLine("Enter the Patients Amount Due: ");
int.TryParse(Console.ReadLine(), out intvalue);
}
}
Array.Sort(patient);
Console.WriteLine("Patients in order with Amounts Owed are: ");
for (int i = 0; i < patient.Length; ++i) ;
//Display(patient[i], numOfPatients);
我就写
return this.PatientId.CompareTo(temp.PatientId)
在覆盖的 CompareTo 方法中 class。无需使用等号。这将为您和 return 正确的值进行比较。
我还建议您只使用 IList class 的一些实现,然后您就可以使用 LinQ 语句了。使用它可以防止 "array"
中出现空值我想到了一些事情:
a) 为什么不实施 IComparable<Patient>
?
b) 为什么要重新实现 int.CompareTo(int)
?您的 IComparable 实现可以只是 return this.PatientID.CompareTo(other.PatientID)
.
c) 您确定排序时数组已满吗?我不确定如果它包含 null
.
看起来如果 Array.Sort 与类型化数组一起传递将调用 Array.Sort<T>(T[])
重载。根据 MSDN documentation,此重载使用 IComparable<T>
接口来比较对象。所以看起来你有两个选择:
- 您可以实施
IComparable<T>
而不是IComparable
(更好)。 - 您可以将数组转换为
Array
以调用使用IComparable
接口的Array.Sort(Array)
重载(更糟)。