Implementing IComparable

2019-04-18 03:31发布

I am implmenting the IComparable to sort like typed objects. My question is why does it cast type person to int32? The array's Sort() seems to cast each type in the array to the type that I am using for comparison.

Comparable:

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


    }

4条回答
太酷不给撩
2楼-- · 2019-04-18 04:03

You're not adding the Persons to the array.

p1.Age = 6

is an assignment, and it returns whatever was assigned to the variable/property (in this case, 6).

You need to do the assignments before putting the Persons into the array.

If you're only looking to put elements of a single type into a collection, you want to use a typed collection rather than an untyped one. This would have caught the problem immediately.

查看更多
倾城 Initia
3楼-- · 2019-04-18 04:06

The best way to implement IComparable is to implement IComparable<T> and pass the calls on to that implementation:

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);
  }
}
查看更多
▲ chillily
4楼-- · 2019-04-18 04:07

Your line:

array.Add(p1.Age = 6)

adds the result of the statement p1.Age = 6 to the ArrayList. This is the int value 6. Nothing to do with IComparable or Sort.

查看更多
We Are One
5楼-- · 2019-04-18 04:21

You are adding person.Age to your arraylist, and person.Age is an int.
You should do something like

Person p1 = new Person(){Age=3};
array.Add(p1);
查看更多
登录 后发表回答