繁体   English   中英

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

[英]C# - Tree / Recursion in Get and Set Accessors?

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

因此,您看到我需要递归树(顺便说一句是List<ItemType> )以获取父级的CalculatedDiscount ,因为它可以为null ,这意味着您需要获取父级的父级的CalculatedDiscount等等。

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

您将如何处理?

就像一个旁注一样,所有这些数据都是通过SqlDataReader从数据库中获取的,而没有特定的顺序,然后,通过遍历树并适当地添加到Children列表中,来填充Children属性列表。 所以父母不知道孩子后才的Set访问被调用,排除了将任何有用的Set访问(例如,设置所有儿童的CalculatedDiscountSet访问)。 除非我错过了其他方法(极有可能,递归有时使我的大脑发疯)。

提前致谢

到目前为止的课程:

    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?
                    }
                }
            }
        }
    }

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

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

通常认为属性做得不多。 因此,我建议您创建一个执行所有遍历的方法GetCalculatedDiscount

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM