我有一个树(List<T>
),其中包含许多ItemType
个类(请参阅下面的代码);该类具有属性OverrideDiscount
(可以是null
,表示使用DefaultDiscount
(可能是null
,表示使用父级 ItemType
的{{1}}))
所以你看我需要递归树(偶然是CalculatedDiscount
)以获得父List<ItemType>
,因为那可能是CalculatedDiscount
,这意味着你需要得到父母的父母null
等等......
将代码放在CalculatedDiscount
访问器中是不是一个坏主意?
你会怎么处理它?</ p>
正如旁注所示,所有这些数据都来自数据库中的Get
,没有特定的顺序,然后通过循环遍历树并添加到SqlDataReader
属性列表来填充Children
属性列表。 {1}}酌情列出。因此,在调用Children
访问者之后,父母才会意识到这些孩子,排除在Set
访问者中放置任何有用的内容(例如,在Set
中设置所有孩子的CalculatedDiscount
访问者)。除非我错过了其他一些方法(很有可能,递归有时会使我的大脑发霉)。
提前致谢
到目前为止的课程:
Set
答案 0 :(得分:4)
我会存储完整的对象,而不仅仅是存储父项的Id。这会使这更容易(我也会将这些公共变量转换为属性):
public class ItemType
{
public int Id { get; set; }
public ItemType Parent { get; set; }
public List<ItemType> Children; { get; set; }
public double? DefaultDiscount { get; set; }
public double? OverridenDiscount { get; set; }
public double CalculatedDiscount
{
get
{
return (double)(OverridenDiscount ??
DefaultDiscount ??
(Parent != null ? Parent.CalculatedDiscount : 0));
}
}
}
答案 1 :(得分:1)
我认为这不是一个好主意。也许在该属性的Xml注释中指定它以确保其他人知道该行为,但如果它代表了程序的逻辑,那么为什么不呢。
答案 2 :(得分:0)
通常认为属性没有做太多。因此,我建议您创建一个方法GetCalculatedDiscount
来执行所有遍历。