【问题标题】:Iteration of an object, that may have parent, or child of it's own same type一个对象的迭代,它可能有它自己的相同类型的父级或子级
【发布时间】:2012-04-17 05:01:17
【问题描述】:

我有一个类,它可能有一个父级,或者它自己的相同类型的子级列表。下面的代码 sn-p 应该解释我的场景。

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
}

感谢任何帮助。

【问题讨论】:

  • 不确定您要达到的目标是什么?您是在尝试识别顶级对象还是什么?
  • 遍历 X 类型对象中的所有元素是我所追求的。并且是一种有效的方法。 ssl 指定的方向似乎是正确的。 @sll 我将尝试您的链接,因为它似乎与我所追求的非常相似。会回来的。

标签: c# .net oop traversal


【解决方案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));

【讨论】:

  • 这正是我所追求的方向。在更改了一点代码以适应我的原始场景后,它有效且正确。非常感谢。
【解决方案2】:

从给定对象遍历到根(ParentItem = null)

public static void SaveSetup(X obj) { 
    while (obj != null)
    {
      // logic here
      obj = obj.ParentItem;
    }
}

【讨论】:

  • 那么你就错过了它的兄弟姐妹(以及叔叔、堂兄弟和侄子)
  • 对不起,如果问题不够清楚。让我在一个场景中解释一下。例如,我想设置一个分支小市场的树层次结构。每个市场,可以有一个母市场,也可以有几个子市场。所以当我想加载一个市场时,我可以看到两件事:1)他/她属于谁 2)其他市场属于这个指定的市场所以对象 X 将是市场。但是一个市场可以拥有许多迷你市场,并且有一个他/她所属的父级。希望这可以清除一些事情:-)
猜你喜欢
  • 1970-01-01
  • 2012-06-11
  • 2012-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多