我有一棵树( List<T>
),其中包含许多 ItemType
类(参见下面的代码);该类具有属性 OverrideDiscount
(可能是 null
,表示使用 DefaultDiscount
(可能是 null
,表示使用父级 ItemType
的 CalculatedDiscount
))
所以你看,我需要递归树(顺便说一句是 List<ItemType>
)来获取父级的 CalculatedDiscount
。 ,因为这可能是 null
,这意味着您需要获取 parent 的 parent 的 CalculatedDiscount
等等...
将其代码放在 Get
中是不是一个坏主意?访问器?
你会如何处理?
作为旁注,所有这些数据都来自 SqlDataReader
从数据库中(无特定顺序),然后是 Children
属性列表通过循环遍历树并添加到Children
来填充。酌情列出。因此,直到Set
之后, parent 才意识到 child 的存在。访问器已被调用,排除了在 Set
中放置任何有用的内容。访问器(例如,在 CalculatedDiscount
访问器中设置所有子项的 Set
)。除非我错过了其他一些方法(很可能,递归有时会烧坏我的大脑)。
提前致谢
到目前为止的类(class):
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)变量转换为属性):
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));
}
}
}
关于C# - Get 和 Set 访问器中的树/递归?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5092183/