我有一个类可能有一个父类,或者它自己的类型相同的子类列表。以下代码段应解释我的方案。
public abstract class X{
public virtual List<X> ChildItems { get; set; }
public virtual X ParentItem { get; set; }
}
我想知道是否有一种特别有效的方法来遍历来自X类型的对象的对象,检查对象是否有父对象,或者是从下到上的子对象。
public static void SaveSetup(X obj) {
//logic here
}
感谢任何帮助。
答案 0 :(得分:1)
您正在处理的是树结构(或可能是许多断开连接的树结构)。树结构具有根元素。通常从根开始遍历树结构。如果你想从树中的任何元素开始,我建议你先获取根元素,然后以通常的方式遍历。
public abstract class X
{
public virtual List<X> ChildItems { get; set; }
public virtual X ParentItem { get; set; }
// Method for traversing from top to bottom
public void Traverse(Action<X> action)
{
action(this);
foreach (X item in ChildItems) {
item.Traverse(action);
}
}
// Get the root (the top) of the tree starting at any item.
public X GetRootItem()
{
X root = this;
while (root.ParentItem != null) {
root = root.ParentItem;
}
return root;
}
}
现在您可以使用
保存设置X root = item.GetRootItem();
root.Traverse(SaveSetup);
lambda表达式的示例。假设已覆盖ToString()
以返回有意义的字符串,则打印树的每个项目。
root.Traverse(x => Console.WriteLine(x));
答案 1 :(得分:0)
从给定对象遍历到根(ParentItem = null)
public static void SaveSetup(X obj) {
while (obj != null)
{
// logic here
obj = obj.ParentItem;
}
}