Использование IComparable

Так что я не обращаю внимания на эту ошибку. Не удалось сравнить два элемента в массиве. Array.Sort(пациент); где ошибка накапливается. У меня есть интерфейс IComparable и файл класса со следующим кодом: Попытка сортировки по идентификационному номеру пациента

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);

person MeggMercer    schedule 09.02.2015    source источник
comment
И какую ошибку вы получаете? Это не похоже на стандартное исключение .NET.   -  person BradleyDotNET    schedule 09.02.2015
comment
В mscorlib.dll произошло необработанное исключение типа «System.InvalidOperationException». Дополнительная информация: Не удалось сравнить два элемента в массиве. Какая ошибка возникает   -  person MeggMercer    schedule 09.02.2015
comment
Вы не обрабатываете NULL и объекты не вашего класса в методе сравнения.   -  person Dawnkeeper    schedule 09.02.2015
comment
Звучит так, будто он сравнивает null со мной. Я думал, что это могло быть в реализации IComparable (если a.CompareTo(b) != b.CompareTo(a) в отладке, он выдаст), но это выглядит нормально.   -  person Wai Ha Lee    schedule 09.02.2015
comment
Посмотрите, есть ли в InnerException более подробная информация. Единственная дыра, которую я вижу, это возможная NullReferenceException.   -  person D Stanley    schedule 09.02.2015


Ответы (3)


Несколько вещей приходят на ум:

а) Почему бы не реализовать IComparable<Patient>?

б) Зачем повторно реализовывать int.CompareTo(int)? Ваша реализация IComparable может просто вернуть this.PatientID.CompareTo(other.PatientID).

c) Вы уверены, что массив полон, когда вы его сортируете? Я не уверен, что произойдет, если он будет содержать null.

person Wai Ha Lee    schedule 09.02.2015
comment
спасибо, я сделал IComparable<Patient> способ, и мне пришлось использовать set{accessor-body}, и ошибка исчезла - person MeggMercer; 09.02.2015

я бы просто написал

return this.PatientId.CompareTo(temp.PatientId)

внутри переопределенного метода CompareTo класса. Нет необходимости использовать символы равенства. Это сделает int сравнение для вас и вернет правильное значение.

Я также предлагаю вам просто использовать некоторую реализацию класса IList, а затем вы можете использовать операторы LinQ. Использование этого предотвратит появление нулевого значения в «массиве».

person Richard Westermann    schedule 09.02.2015

Похоже, что если Array.Sort передается с типизированным массивом, это вызовет перегрузку Array.Sort<T>(T[]). Согласно документации MSDN эта перегрузка использует интерфейс IComparable<T> для сравнения объектов. Итак, похоже, у вас есть два варианта:

  1. Вы можете реализовать IComparable<T> вместо IComparable (лучше).
  2. Вы можете привести свой массив к Array, чтобы вызвать перегрузку Array.Sort(Array), которая использует интерфейс IComparable (хуже).
person Erik    schedule 09.02.2015