-2

型指定されたオブジェクトのように並べ替えるために IComparable を実装しています。私の質問は、なぜ type person を int32 にキャストするのですか? 配列の Sort() は、配列内の各型を、比較に使用している型にキャストしているようです。

同程度の:

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

4 に答える 4

11

あなたの行:

array.Add(p1.Age = 6)

ステートメントの結果をp1.Age = 6ArrayList に追加します。これは int 値 6 です。IComparable や Sort とは関係ありません。

于 2009-12-12T19:11:25.030 に答える
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);
  }
}
于 2009-12-12T19:38:30.257 に答える
4

Persons を配列に追加していません。

p1.Age = 6

は割り当てであり、変数/プロパティに割り当てられたもの (この場合は 6) を返します。

Persons を配列に入れる前に、割り当てを行う必要があります。

単一の型の要素のみをコレクションに入れたい場合は、型なしコレクションではなく、型付きコレクションを使用する必要があります。これで問題はすぐに見つかりました。

于 2009-12-12T19:14:29.750 に答える
1

配列リストに person.Age を追加していますが、person.Age は int です。
次のようなことをする必要があります

Person p1 = new Person(){Age=3};
array.Add(p1);
于 2009-12-12T19:13:22.817 に答える