Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Get和Set访问器中的C#-树/递归?_C#_Recursion_Tree_Accessor - Fatal编程技术网

Get和Set访问器中的C#-树/递归?

Get和Set访问器中的C#-树/递归?,c#,recursion,tree,accessor,C#,Recursion,Tree,Accessor,我有一个树(一个列表),其中包含许多ItemType类(见下面的代码);该类具有属性OverrideDiscovery(可以是null,表示使用DefaultDiscount(可以是null,表示使用父项项类型计算的Discount) 所以你看,我需要递归树(顺便说一句,这是一个列表)来获取父级的CalculatedDiscount,因为这可能是null,这意味着你需要获取父级的CalculatedDiscount等等 将此代码放在Get访问器中是不是一个坏主意 你会怎么处理 正如旁注一样,所有

我有一个树(一个
列表
),其中包含许多
ItemType
类(见下面的代码);该类具有属性
OverrideDiscovery
(可以是
null
,表示使用
DefaultDiscount
(可以是
null
,表示使用父项
项类型
计算的Discount

所以你看,我需要递归树(顺便说一句,这是一个
列表
)来获取父级的
CalculatedDiscount
,因为这可能是
null
,这意味着你需要获取父级的
CalculatedDiscount
等等

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

你会怎么处理

正如旁注一样,所有这些数据都是通过
SqlDataReader
从数据库中无特定顺序获得的,然后通过循环遍历树并添加到
Children
列表来填充
Children
属性列表。因此,在调用
集合
访问器之前,家长不知道孩子的情况,排除了在
集合
访问器中放入任何有用的内容(例如,在
集合
访问器中设置所有孩子的
计算Discount
)。除非我错过了其他的方法(很有可能,递归有时会折磨我的大脑)

提前谢谢

到目前为止的课程:

    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?
                    }
                }
            }
        }
    }
公共类ItemType
{
公共int ID;
公共int?ParentID;
公开儿童名单;
公共双折扣;
公共双覆盖搜索;
公共双重计算贴现
{
得到
{
if(overrideDiscovery!=null)
{
退货(双倍)覆盖检查;//+Autospec数量
}
其他的
{
如果(默认折扣!=null)
{
退货(双倍)折扣;
}
其他的
{
//我需要获得此ItemType的父级折扣
//在这里,通过在树上递归…这是个坏主意吗?
}
}
}
}
}

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

我将存储完整的对象,而不仅仅是存储父项的Id。这将使这更容易(我还将这些公共变量转换为属性):

公共类ItemType
{
公共int Id{get;set;}
公共ItemType父项{get;set;}
公共列表子项;{get;set;}
公共双精度?默认折扣{get;set;}
public double?overrideDiscount{get;set;}
公共双重计算贴现
{
得到
{
返回(双倍)(覆盖计数??
默认折扣??
(Parent!=null?Parent.CalculatedDiscount:0));
}
}
}

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

假设获得父级引用相对较快,并且没有循环风险,我看不出这有什么不好的原因。是的,我真的发现这是最简单的方法。谢谢在相关新闻中,我想这样做,如果有人试图将一个值设置为CalculatedDiscount,它会保持CalculatedDiscount不变,并只设置OverrideDiscount-我可以用just
OverrideDiscount=value
在Set访问器中?@Jez Clark-是的,这会起作用,尽管设置CalculatedDiscount的副作用很难理解。我将CalculatedDiscount保留为只读属性,如果使用者需要显式设置值,则由使用者设置OverrideDiscount。我使用的库(ObjectListView)需要绑定到单个属性,因此问题是-我希望它显示计算值,但当用户编辑它时,将值放入override中。然而,经过一些研究之后,我可能能够将这段代码放在OLV的AspectPutter委托中,这样就不用使用Set访问器了。谢谢
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));
        }
    }
}