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