2014-09-08 2 views
0

Как один вложенный список иерархий:Выбрать и показать только родительский узел на основе выбора ребенка

A--A1---A2 
|  | 
|  A21 
| 
B--B1---B2 
| |  | 
| B11 B21 
| 
C--C1---C2 
| |  | 
| C11 C21 

Теперь мой slection будет на Листе узле только то B21 только тогда B-B2 - B21- должен быть в моем списке.

B----B2 
|  | 
| B21 
| 

Как я могу сделать это в более разумном способе или любой функции, где я буду проходить любой узел над появится его родитель.

+3

Вам нужно будет дать нам более подробную информацию о том, как ваш код структурирован для нас, чтобы помочь вам в этом. Это будет полностью зависеть от того, как вы храните и получаете доступ к этим элементам. – Chris

+1

Вы можете просто посмотреть на прямой родительский элемент - если узел является родителем выбранного узла, включите его и т. Д. - вы можете сделать это в цикле while, чтобы избежать рекурсии, например. 'while (node.Parent! = null) {nodeList.Add (node.Parent); node = node.Parent; } ' – Charleh

+0

@Mashton: вопрос был обновлен, чтобы остановить все эти' '' '' '' '' и распались в одну массу. Надеюсь, обновление должно устранить эту проблему ... – Chris

ответ

1

С each node has a reference to its parent получить последовательность узла со всеми его родителями довольно тривиально:

public static IEnumerable<T> Ancestors<T>(T node, Func<T, T> parentSelector) 
{ 
    T current = node; 
    while(current != null) 
    { 
     yield return current; 
     current = parentSelector(current); 
    } 
} 

Вы можете затем передать в узле и функции индикации, как получить его родитель:

var Ancestors = Ancestors(node, n => n.Parent); 
Смежные вопросы