سؤال

أنا أشعر بتهيئة الصغار للفرز مثل الكائنات المكتوبة. سؤالي هو لماذا يلقي نوع الشخص إلى INT32؟ يبدو أن فرز الصفيف () يلقي كل نوع في الصفيف إلى النوع الذي أستخدمه للمقارنة.

مماثلة:

public class Person:IComparable 
{
   protected int age;

   public int Age { get; set; }

   public int CompareTo(object obj)
   {
       if(obj is Person)
       {
           var person = (Person) obj;
          return age.CompareTo(person.age);
       }
       else
       {
           throw new ArgumentException("Object is not of type Person");
       }
   }
}

}

class Program
{
    static void Main(string[] args)
    {
        Person p1 = new Person();
        Person p2 = new Person();
        Person p3 = new Person();
        Person p4 = new Person();

        ArrayList array = new ArrayList();

        array.Add(p1.Age = 6);
        array.Add(p2.Age = 10);
        array.Add(p3.Age = 5);
        array.Add(p4.Age = 11);

        array.Sort();

        foreach (var list in array)
        {
            var person = (Person) list; //Cast Exception here.

            Console.WriteLine(list.GetType().ToString()); //Returns System.Int32
        }
        Console.ReadLine();


    }
هل كانت مفيدة؟

المحلول

خطك:

array.Add(p1.Age = 6)

يضيف نتيجة البيان p1.Age = 6 إلى قائمة الصفحات. هذه هي القيمة الدولية 6. لا علاقة لها بالتعدي أو الترتيب.

نصائح أخرى

أفضل طريقة لتنفيذ IComparable هو التنفيذ IComparable<T> وتمرير المكالمات إلى هذا التنفيذ:

class Person : IComparable<Person>, IComparable
{
  public int Age { get; set; }

  public int CompareTo(Person other)
  {
    // Should be a null check here...
    return this.Age.CompareTo(other.Age);
  }

  public int CompareTo(object obj)
  {
    // Should be a null check here...
    var otherPerson = obj as Person;
    if (otherPerson == null) throw new ArgumentException("...");
    // Call the generic interface's implementation:
    return CompareTo(otherPerson);
  }
}

أنت لا تضيف الأشخاص إلى الصفيف.

p1.Age = 6

هي مهمة، ويعود كل ما تم تعيينه إلى المتغير / الخاصية (في هذه الحالة، 6).

تحتاج إلى القيام بالمهام قبل وضع الأشخاص في الصفيف.

إذا كنت تتطلع فقط إلى وضع عناصر من نوع واحد في مجموعة، فأنت تريد استخدام مجموعة مكتوبة بدلا من واحد غير مصقول. كان هذا قد اشتعلت المشكلة على الفور.

تقوم بإضافة شخص إلى قائمة صفيفك، وشخصي.
يجب أن تفعل شيئا مثل

Person p1 = new Person(){Age=3};
array.Add(p1);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top