Итерация объекта, который может иметь родителя или потомка своего собственного типа - PullRequest
0 голосов
/ 03 апреля 2012

У меня есть класс, у которого может быть родитель или список детей того же типа, что и у него. Следующий фрагмент кода должен объяснить мой сценарий.

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 ]

1 голос
/ 03 апреля 2012

То, с чем вы имеете дело, - это древовидная структура (или, возможно, множество разрозненных древовидных структур). Древовидная структура имеет корневой элемент. Обычно древовидная структура обходится, начиная с корня. Если вы хотите начать с любого элемента в дереве, я бы посоветовал вам сначала получить корневой элемент, а затем пройти обычным образом.

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);

Пример с лямбда-выражением. Печатает каждый элемент дерева, предполагая, что ToString() был переопределен для возврата значимой строки.

root.Traverse(x => Console.WriteLine(x));
0 голосов
/ 03 апреля 2012

Переход от данного объекта к корню (ParentItem = null)

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