C#i可与单亲和两个子女相比

C#i可与单亲和两个子女相比,c#,icomparable,C#,Icomparable,我有一个类Human,它实现了IComparable 然后,我又继承了两个类:Human和堂兄弟:Human 父类有一个属性AGE,它在getter中调用了一个抽象的函数getAge() 我有一个人类列表,当我在数据网格中显示它们时,每个年龄都被正确计算出来 我想使用年龄作为属性对列表进行排序,所以我创建了人类抽象类来实现Icomparable,然后是这样的方法 public int CompareTo(Human other) { return this.age.CompareTo(

我有一个类Human,它实现了
IComparable

然后,我又继承了两个类:Human和堂兄弟:Human

父类有一个属性AGE,它在getter中调用了一个抽象的函数getAge()

我有一个人类列表,当我在数据网格中显示它们时,每个年龄都被正确计算出来

我想使用年龄作为属性对列表进行排序,所以我创建了人类抽象类来实现Icomparable,然后是这样的方法

public int CompareTo(Human other)
{
     return this.age.CompareTo(other.age);
}
我在ASP中调用
list.sort()
方法,如下所示

List<Human> hlist = instance.humanlist;
hlist.Sort();
tblHumans.DataSource = hlist;
tblHumans.DataBind();
public int Age
{
    get
    {
        return getAge();
    }

    set
    {
        age = getAge();
    }
}
getAge()是我的子类重写的抽象方法

当呈现表格时,计算将正确返回值,每个值都具有正确的结果


我做错了什么?

像这样调试您的问题

List<Human> hlist = instance.humanlist;
hlist.Sort();

// What is the order of the elements here, have they been sorted as you expect?    

tblHumans.DataSource = hlist;
tblHumans.DataBind();
List hlist=instance.humanlist;
hlist.Sort();
//这里元素的顺序是什么,它们是否按照您的预期进行了排序?
tblHumans.DataSource=hlist;
tblHumans.DataBind();
如果列表按预期排序,则问题在于网格,如果不是,则说明您没有正确实现
IComparable
Age
属性。哪一个?

简短回答 (
Age
,而不是
Age

更长的答案 您对
Age
属性的实现已中断。您有一个
age
字段,但getter不使用它的值(它只调用
getAge()
)。setter忽略隐式的
参数,因此它只将
age
赋值给
getAge()
的结果。因此,虽然没有调用setter,
age
未初始化,其值为0。您可能根本不应该使用setter,您应该删除
age
字段,因为
age
的值仅由
getAge()的实现决定

感谢大家花时间阅读和回答这个问题

最后我做了这样一件事:

1) 使用普通getter和setter再次设置age属性和字段 2) 在子类中,当我重写getAge方法时,我也会强制设置age,因此,当在列表的sort方法中调用compareTo时,会填充age属性,使其显示在表中

我知道这不是“最佳实践”,但必须这样做,因为在这个程序中,我不能使用“复杂”的数据模型(即使是数据库也不行,但不用担心,这不是生产系统)


再次感谢大家

与您的问题无关,但让
孩子
表亲
继承自
人类
。。。“孩子”和“表亲”是关系,而不是人的类型。您是否尝试过在
CompareTo
方法中设置断点以确保它被调用?您的问题缺少关于TBL人是什么类型的信息。最可能的情况是,数据源属性忽略排序,除非您使用某些特定的集合,例如BindingList。您的setter是错误的。它应该是
=值。我会小心使用
IComparable
。当有人想按姓名对人类进行分类时会发生什么
IComparable
最适合用于具有单一明确顺序的值类型。例如,.NET结构
biginger
实现了这一点,因为整数有一个已知的顺序。对于希望根据复杂对象的属性进行排序的情况,最好使用lambdas(使用
List.sort
或LINQ的
OrderBy
)或实现
IComparer
(例如
HumanAgeComparer
)。如果删除年龄字段,如何在网格中使用它?我放置age属性的唯一原因是因为我需要按它进行排序。实际上,这是一个很小的差异,我只是将这个方法在CompareTo(人类其他)中公开了{返回this.getAge().CompareTo(其他.getAge());}现在我需要弄清楚如何在网格上显示数据,因为它不再在网格上object@Alexev您应该按属性(
Age
)进行比较,而不是按字段(
Age
)进行比较。该字段是一个实现细节,从您发布的代码来看,您并没有真正使用它。
getAge()
的实现可能会使用一个字段来存储值,但是在比较值时,您不需要关心这一点。
public int CompareTo(Human other)
{
     return this.Age.CompareTo(other.Age);
}