对象的迭代,可能有父对象,也可能有自己相同类型的子对象

时间:2012-04-03 14:08:18

标签: c# .net oop traversal

我有一个类可能有一个父类,或者它自己的类型相同的子类列表。以下代码段应解释我的方案。

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
}

感谢任何帮助。

2 个答案:

答案 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;
    }
}
相关问题