2012-08-05 2 views
0

은 다음 클래스를 감안할 때 나무의 특정 수준에있는 모든 노드를 얻기 :트리 계층 구조를 구축하는 데 사용

public class simpletest 
{ 
    public simpletest Parent { get; set; } 
    public IList<simpletest> Children { get; set; } 
    public string Name { get; set; } 
} 

가 어떻게 특정 레벨에 대한 모든 객체의 목록을 얻을 수 있을까? 여기

몇 가지 샘플 데이터 (희망의 올바른 형식을)입니다 :

var root = new simpletest() { Name = "Root" }; 
var level1childA = new simpletest() { Name = "level1childA", Parent = root }; 
var level1childB = new simpletest() { Name = "level1childB", Parent = root }; 

var level2childA = new simpletest() { Name = "level2childA", Parent = level1childA }; 
var level2childB = new simpletest() { Name = "level2childB", Parent = level1childA }; 
var level2childC = new simpletest() { Name = "level2childC", Parent = level1childB }; 
var level2childD = new simpletest() { Name = "level3childD", Parent = level1childB }; 

var level3childA = new simpletest() { Name = "level3childA", Parent = level2childA }; 
var level3childB = new simpletest() { Name = "level3childB", Parent = level2childA }; 
var level3childC = new simpletest() { Name = "level3childC", Parent = level2childB }; 
var level3childD = new simpletest() { Name = "level3childD", Parent = level2childB }; 
var level3childE = new simpletest() { Name = "level3childE", Parent = level2childC }; 
var level3childF = new simpletest() { Name = "level3childF", Parent = level2childC }; 
var level3childG = new simpletest() { Name = "level3childG", Parent = level3childD }; 
var level3childH = new simpletest() { Name = "level3childH", Parent = level3childD }; 

level2childA.Children = new List<simpletest> { level3childA, level3childB }; 
level2childB.Children = new List<simpletest> { level3childC, level3childD }; 
level2childC.Children = new List<simpletest> { level3childE, level3childF }; 
level2childD.Children = new List<simpletest> { level3childG, level3childH }; 

level1childA.Children = new List<simpletest> { level2childA, level2childB }; 
level1childB.Children = new List<simpletest> { level2childC, level2childD }; 

그래서 예를 들어, 노드 level3childE를 사용하여, 어떻게 같은 수준에서 모든 노드를 얻을 것? 노드 이름은 무엇이든 될 수 있습니다.

+0

각 노드의 루트에 깊이를 반환하는 방법'Depth' 만들기는? 그런 다음 적절한 쿼리를 사용하여 루트 노드에서 LINQ를 선택 하시겠습니까? –

+2

Level/Depth 속성을 만들고이 속성을 기반으로 개체를 쿼리하거나 트리 항목을 통해 원하는 수준으로 iteratres하는 기본 for 루프를 만들 수 있습니다. – timothyclifford

답변

1

여기 simpletest의 멤버 함수로 구현 된 (검증되지 않은) 재귀 적 접근 방식 :

IEnumerable<simpletest> ElementsAtDepth(int depth) { 
    if(depth > 0) { 
     foreach(simpletest child in this.Children) 
      foreach(simpletest element in child.ElementsAtDepth(depth - 1)) 
       yield return element; 
    } 
    else { 
     foreach(simpletest element in this.Children) 
      yield return element; 
    } 
} 
+0

위의 샘플 데이터가있는 경우 BlackBear 감사합니다. 지정된 깊이의 모든 노드를 가져옵니다. 결과에 중복이 포함되어 있음을 알았습니다. 깊이가 1 인 경우 level1childA와 level1childB가 두 개 반환됩니다. 또한, 깊이가 최하위 레벨 인 3으로 지정되고 노드 (리프 노드?)가없는 경우 "foreach (this.Children의 simpletest 요소)"행에 오류가 발생합니다. –

+0

@ JohnSmith : 코드에서 오타를 발견했습니다. 시도해보십시오. 자녀가 null이기 때문에 발생하는 오류에 대해서는 costructor에서 초기화해야합니다. – BlackBear

+0

트릭을 한 감사의 BlackBear. –

관련 문제