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-我可以用justOverrideDiscount=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));
}
}
}