2009-12-12 2 views
-2

Я привожу IComparable для сортировки типа типизированных объектов. Мой вопрос заключается в том, почему он вводит тип человека в int32? Сортировка массива() кажется, что каждый тип массива применяет к типу, который я использую для сравнения.Реализация IComparable

Сопоставимые:

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


    } 
+0

КСТАТИ: Если вы на .Net 3.5, вам не нужно использовать Sort() и IComparable. Существует новый метод расширения, называемый OrderBy, который намного проще в использовании, чем Sort. –

+4

Если он на .Net 3.5 (или 2.0), он действительно не должен использовать ArrayList, но List . У него не было бы этой проблемы, если бы он (он получил ошибку компиляции, и это, вероятно, выяснило бы проблему). –

+0

Почему вы не используете общий «Список » и 'IComparable '? – thecoop

ответ

11

Ваша линия:

array.Add(p1.Age = 6) 

добавляет результат заявления p1.Age = 6 к ArrayList. Это значение int 6. Ничто не связано с IComparable или Sort.

+0

Of Coarse ... спасибо – Nick

1

Вы добавляете person.Age в свой arraylist и person.Age - это int.
Вы должны сделать что-то вроде

Person p1 = new Person(){Age=3}; 
array.Add(p1); 
4

Вы не добавлять лиц в массив.

p1.Age = 6 

это задание, и возвращает то, что было назначено к переменной/свойства (в данном случае 6).

Вам необходимо выполнить задания перед тем, как положить Лица в массив.

Если вы хотите только поместить элементы одного типа в коллекцию, вы хотите использовать типизированную коллекцию, а не нетипизированную. Это сразу поймало бы проблему.

7

Лучший способ реализации 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); 
    } 
} 
+0

Вы можете добавить if (other == null) return 1; в вашем CompareTo – mayu

+0

@Tymek, хорошая точка, эта реализация не грамотно обрабатывается с объектами других типов (гетерогенные коллекции) или даже с нулями одного и того же типа. – Constantin

Смежные вопросы