【问题标题】:C# - Tree / Recursion in Get and Set Accessors?C# - 获取和设置访问器中的树/递归?
【发布时间】:2011-02-23 22:35:07
【问题描述】:

我有一棵树(List<T>),其中包含许多 ItemType 类(请参见下面的代码);该类具有属性OverrideDiscount(可以是null,表示使用DefaultDiscount(可以是null,表示使用ItemTypeCalculatedDiscount ))

所以你看我需要递归树(顺便说一下是List<ItemType>)来得到父级的CalculatedDiscount,因为那可能是null,这意味着你需要得到父级的父级CalculatedDiscount等等……

将代码放在Get 访问器中是不是一个坏主意?

你会怎么处理?

顺便说一句,所有这些数据都来自数据库中的SqlDataReader,没有特定的顺序,然后通过循环遍历树并添加到Children 列表中来填充Children 属性列表合适的。因此,在调用 Set 访问器之后,父母才知道孩子,排除在 Set 访问器中放置任何有用的东西(例如,将所有孩子的 CalculatedDiscount 设置在 Set 访问器中)。除非我错过了其他一些方法(很有可能,递归有时会伤到我的大脑)。

提前致谢

目前的课程:

    public class ItemType
    {
        public int ID;
        public int? ParentID;
        public List<ItemType> Children;

        public double? DefaultDiscount; 
        public double? OverrideDiscount; 
        public double CalculatedDiscount
        {
            get
            {
                if (OverrideDiscount != null)
                {
                    return (double)OverrideDiscount; //+ Autospec qty
                }
                else
                {
                    if (DefaultDiscount != null)
                    {
                        return (double)DefaultDiscount;
                    }
                    else
                    {

                        //I need to get this ItemType's parent's discount 
                        //here by recursing up the tree...is this a bad idea?
                    }
                }
            }
        }
    }

【问题讨论】:

  • 假设获得对父级的引用相对较快,并且没有循环风险,我看不出有什么不好的原因。

标签: c# recursion tree accessor


【解决方案1】:

我会存储完整的对象,而不是只存储父项的 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));
        }
    }
}

【讨论】:

  • 是的,我刚刚发现这是最简单的方法。谢谢。在相关新闻中,我想这样做,所以如果有人尝试为 CalculatedDiscount 设置一个值,它会保持 CalculatedDiscount 不变并且只设置 OverrideDiscount - 我可以在 Set 访问器中仅使用 OverrideDiscount = value; 来执行此操作吗?
  • @Jez Clark - 是的,这将起作用,尽管它使设置 CalculatedDiscount 的副作用难以理解。如果需要显式设置值,我会将 CalculatedDiscount 保留为只读属性,并让消费者设置 OverridenDiscount。
  • 我正在使用需要绑定到单个属性的库(ObjectListView),因此问题 - 我希望它显示计算值,但是当用户编辑它时,将值在覆盖中。然而,经过一些研究,我也许可以将那段代码放在 OLV 的 AspectPutter 委托中,从而单独留下 Set 访问器。谢谢
【解决方案2】:

我认为这不是一个好主意。也许在 Xml cmets 中为该属性指定它以确保其他人知道该行为,但如果它代表您程序的逻辑,那为什么不呢。

【讨论】:

    【解决方案3】:

    属性通常被认为没有多大作用。因此,我建议您创建一个方法 GetCalculatedDiscount 来完成所有遍历。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-26
      • 2012-10-18
      • 2012-07-14
      • 1970-01-01
      • 2012-11-02
      相关资源
      最近更新 更多