实现IComparable
我正在将IComparable归类为类似对象的排序。 我的问题是为什么它将类型转换为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(); }
你的路线:
array.Add(p1.Age = 6)
将语句p1.Age = 6
的结果添加到ArrayList。 这是int值6.与IComparable或Sort无关。
实现IComparable
的最佳方法是实现IComparable
并将调用传递给该实现:
class Person : IComparable, 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)。
在将Persons放入数组之前,您需要执行分配。
如果您只想将单个类型的元素放入集合中,则需要使用类型化集合而不是非类型集合。 这会立即解决问题。
你正在添加person.Age到你的arraylist和person.Age是一个int。
你应该做点什么
Person p1 = new Person(){Age=3}; array.Add(p1);