[英]C# - Tree / Recursion in Get and Set Accessors?
我有一棵树( List<T>
),其中包含许多ItemType
类(请参见下面的代码); 该类具有OverrideDiscount
属性(可以为null
,指示使用DefaultDiscount
(可以为null
,指示使用父 ItemType
的CalculatedDiscount
))
因此,您看到我需要递归树(顺便说一句是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?
}
}
}
}
}
我将存储完整的对象,而不仅仅是存储父项的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.