C# IComparable 1 parent 和 2 children
C# IComparable with one parent and 2 children
好吧,我有一个 class 人执行 IComparable<Human>
然后我还有两个 classes 继承自 Human Child:Human 和 Cousin:Human
Parent class 有一个 属性 AGE,在 getter 中有一个抽象函数 getAge() 的调用。
我有一个人类列表,当我在数据网格中显示它们时,每个年龄都会被正确计算。
我想使用年龄作为属性对列表进行排序,所以我制作了 Human 抽象 class 来实现 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();
页面加载了所有数据,但项目未按年龄排序,似乎是按列表中的位置排序。
我的 tblHumans 是
<asp:GridView ID="tblHumans" runat="server">
</asp:GridView>
在Parentclass属性AGE是这样的
public int Age
{
get
{
return getAge();
}
set
{
age = getAge();
}
}
getAge() 是我的 child classes 覆盖的抽象方法
计算 returns 值是正确的,当呈现 table 时,每个值都正确。
我做错了什么?
像这样调试你的问题,
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();
如果列表按照您的预期排序,那么问题出在网格上,如果不是,那么您没有正确实现 IComparable
或 Age
属性。是哪个?
简答
public int CompareTo(Human other)
{
return this.Age.CompareTo(other.Age);
}
(Age
, 不是 age
)
更长的答案
您对 Age
属性 的实施已损坏。您有一个 age
字段,但 getter(仅调用 getAge()
)未使用它的值。而 setter 忽略了隐含的 value
参数,因此它只是将 age
分配给 getAge()
的结果。因此,虽然 setter 尚未被调用,但 age
未初始化且其值为 0。您可能根本不应该有 setter,并且您应该删除age
字段,因为 Age
的值仅由 getAge()
.
的实现决定
好的,我解决了
感谢大家花时间阅读并回答这个问题。
最后我做了这个:
1) 再次设置年龄 属性 和正常 getter 和 setter 字段
2) 在 child class 中,当我覆盖 getAge 方法时,我也强制设置年龄,因此,当在列表的排序方法中调用 compareTo 时,年龄 属性 被填充所以它显示在 table.
我知道它不是 'the best practic' 但它必须以这种方式制作,因为在这个程序中我不能使用 'complex' 数据模型(甚至不是数据库,但不用担心不是为了生产系统)
再次感谢大家
好吧,我有一个 class 人执行 IComparable<Human>
然后我还有两个 classes 继承自 Human Child:Human 和 Cousin:Human
Parent class 有一个 属性 AGE,在 getter 中有一个抽象函数 getAge() 的调用。
我有一个人类列表,当我在数据网格中显示它们时,每个年龄都会被正确计算。
我想使用年龄作为属性对列表进行排序,所以我制作了 Human 抽象 class 来实现 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();
页面加载了所有数据,但项目未按年龄排序,似乎是按列表中的位置排序。
我的 tblHumans 是
<asp:GridView ID="tblHumans" runat="server">
</asp:GridView>
在Parentclass属性AGE是这样的
public int Age
{
get
{
return getAge();
}
set
{
age = getAge();
}
}
getAge() 是我的 child classes 覆盖的抽象方法
计算 returns 值是正确的,当呈现 table 时,每个值都正确。
我做错了什么?
像这样调试你的问题,
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();
如果列表按照您的预期排序,那么问题出在网格上,如果不是,那么您没有正确实现 IComparable
或 Age
属性。是哪个?
简答
public int CompareTo(Human other)
{
return this.Age.CompareTo(other.Age);
}
(Age
, 不是 age
)
更长的答案
您对 Age
属性 的实施已损坏。您有一个 age
字段,但 getter(仅调用 getAge()
)未使用它的值。而 setter 忽略了隐含的 value
参数,因此它只是将 age
分配给 getAge()
的结果。因此,虽然 setter 尚未被调用,但 age
未初始化且其值为 0。您可能根本不应该有 setter,并且您应该删除age
字段,因为 Age
的值仅由 getAge()
.
好的,我解决了
感谢大家花时间阅读并回答这个问题。
最后我做了这个:
1) 再次设置年龄 属性 和正常 getter 和 setter 字段 2) 在 child class 中,当我覆盖 getAge 方法时,我也强制设置年龄,因此,当在列表的排序方法中调用 compareTo 时,年龄 属性 被填充所以它显示在 table.
我知道它不是 'the best practic' 但它必须以这种方式制作,因为在这个程序中我不能使用 'complex' 数据模型(甚至不是数据库,但不用担心不是为了生产系统)
再次感谢大家