我正在将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();
}
答案 0 :(得分:11)
你的专栏:
array.Add(p1.Age = 6)
将语句p1.Age = 6
的结果添加到ArrayList。这是int值6.与IComparable或Sort无关。
答案 1 :(得分: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);
}
}
答案 2 :(得分:4)
您没有将人员添加到数组中。
p1.Age = 6
是一个赋值,它返回赋给变量/ property的任何内容(在本例中为6)。
在将人员放入数组之前,您需要进行分配。
如果您只想将单个类型的元素放入集合中,则需要使用类型化集合而不是非类型集合。这会立即解决问题。
答案 3 :(得分:1)
你正在添加person.Age到你的arraylist和person.Age是一个int 你应该做点什么
Person p1 = new Person(){Age=3};
array.Add(p1);