C# - 获取和设置访问器中的树/递归?

时间:2011-02-23 14:28:00

标签: c# recursion tree accessor

我有一个树(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

3 个答案:

答案 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来执行所有遍历。