2012-08-09 5 views
-2

우리는 TreeView가있는 Windows 응용 프로그램이 있고이보기의 노드를 확장하고 자식 노드로 드릴 다운 할 수 있다고 가정 해 봅시다. 더 많은 자식이있을 수 있으므로 이제 해당 노드를 확장 할 수 있습니다 그리고 더 나아가, 등등 .. 그래서 내 소스 코드에서 나는 우리가 클릭하고 아이들을 찾고 그들을 나열하는 아버지 노드를 얻는 메소드 Foo(string fatherNode)을 가지고있다 :아버지 - 자녀 관계 가져 오기

이 메소드의 상위 레벨 몸체는 다음과 같다 :

코드는 UI를 사용하는 앱에 적합합니다. 노드를 클릭하면이 메소드가 한 번 실행되고 필요한 데이터가 수집됩니다. 위의 메서드의 유용한 선을 활용하여 다른 메서드를 작성하고 즉시 한 번에 모든 파일을 말하도록 전체 정보를 작성하십시오.

내 머리 속에는 재귀 적 방법처럼 보입니다. 하지만 여전히 전체 그림을 파악할 수는 없지만 Prob에는 아버지 용 컬렉션, 어린이 용 컬렉션, 애들을위한 반복 컬렉션, 더 많은 애들을 불러 컬렉션에 추가하는 등의 두 컬렉션이 있어야합니다.

안개를 제거 할 수 있는지, 내가해야 할 일의 높은 수준, 어떻게해야할지, 어디에 추가할지, 재귀 적 메서드 호출을 호출 할 곳 등을 결정할 수 있는지 궁금합니다. 및 please 특별히 "treeview"객체에 대해 생각하지 않아서, 나는 더 나은 질문을 expalin하기 위해 예제로 사용했습니다. 가장 중요한 것은 내가 게시 한 Foo 메서드의 구조입니다. 그것이 내가해야 할 일입니다.

+0

(1)이 목록의 클래스를 제공 할 수있다, 그래서 우리는 단지 트 리뷰에 대해 생각하지 않아? (2) 모든 것을 잡아내는 것 *은 무엇을 의미합니까? –

+0

@AndreCalil : 모든 것을 잡아라. 나는 모든 아버지와 모든 아이들을위한 아버지와 그 자녀의 전체 계급을 의미한다. treeview를 클릭 할 수있는 특정 노드뿐만 아니라 모든 노드가 동시에 확장되면 트리 뷰가 표시 할 수있는 데이터의 전체 계층 구조를 내보내는 것과 같습니다. – Bohn

+0

첫 번째 주석'// 일부 db 스크립트 호출 '은 아버지 노드 및 하위 정보에 대해서만 데이터를 가져오고 그보다 더 깊게 가지 않습니다? – Ankush

답변

1

글쎄요, 다른 답변을 찾은 후에도 이것이 당신이 찾고있는 것인지 확실하지 않습니다. 그러나, 그것을 확인하시기 바랍니다 :

셀프 관련 엔티티 (노드)

public class MyEntity 
{ 
    public MyEntity() { } 

    public MyEntity(string Name, int ID, int? ParentID) 
    { 
     this.Name = Name; 
     this.ID = ID; 
     this.ParentID = ParentID; 
    } 

    public string Name { get; set; } 
    public int ID { get; set; } 
    public int? ParentID { get; set; } 
} 

트리 건물 방법

public static StringBuilder GetFamilyTree(List<MyEntity> AllTheEntities) 
    { 
     StringBuilder Return = new StringBuilder(); 

     List<MyEntity> OrderedEntities = AllTheEntities.OrderBy<MyEntity, int>(x => x.ID).ToList(); 

     foreach (MyEntity CurrentEntity in AllTheEntities.Where<MyEntity>(x => !x.ParentID.HasValue)) 
     { 
      Return.AppendLine(GetEntityTree(AllTheEntities, CurrentEntity)); 
     } 

     return Return; 
    } 

    public static string GetEntityTree(List<MyEntity> AllTheEntities, MyEntity CurrentEntity, int CurrentLevel = 0) 
    { 
     StringBuilder Return = new StringBuilder(); 

     Return.AppendFormat("{0}{1}", "\t".Repeat(CurrentLevel), CurrentEntity.Name); 
     Return.AppendLine(); 

     List<MyEntity> Children = AllTheEntities.Where<MyEntity>(x => x.ParentID.HasValue && x.ParentID.Value == CurrentEntity.ID).ToList(); 

     if (Children != null && Children.Count > 0) 
     { 
      foreach (MyEntity CurrentChildEntity in Children) 
      { 
       Return.Append(GetEntityTree(AllTheEntities, CurrentChildEntity, CurrentLevel + 1)); 
      } 
     } 

     return Return.ToString(); 
    } 

작은 헬퍼 클래스

public static class StringExtension 
{ 
    public static string Repeat(this string text, int times) 
    { 
     string Return = string.Empty; 

     if (times > 0) 
     { 
      for (int i = 0; i < times; i++) 
      { 
       Return = string.Concat(Return, text); 
      } 
     } 

     return Return; 
    } 
} 

사용

 List<MyEntity> AllMyEntities = new List<MyEntity>(); 
     AllMyEntities.Add(new MyEntity("1", 1, null)); 
     AllMyEntities.Add(new MyEntity("1.1", 2, 1)); 
     AllMyEntities.Add(new MyEntity("1.1.1", 3, 2)); 
     AllMyEntities.Add(new MyEntity("2", 4, null)); 
     AllMyEntities.Add(new MyEntity("2.1", 5, 4)); 

     Console.Write(GetFamilyTree(AllMyEntities).ToString()); 

결과

1 
    1.1 
     1.1.1 
2 
    2.1 
1

Foo(child)for 루프 내로 전화하십시오. 나는 그것이 당신의 문제를 해결할 것 같아요. 나무가 거대한 경우 재발하지 마십시오. 스택 사용.

+0

그래, 아직 완료되지 않았어. 내 두 개의 아버지와 아이들의 컬렉션을 채우기 위해 ... 결국,이 아버지는이 아이들을 가졌습니다.이 아버지는이 아이들을 가지고 있습니다. ..... – Bohn

+0

It 's 두 가지 컬렉션이 아닙니다. 그것은 n-ary 트리입니다. 나는 당신과이 간단한 트리를 혼동스럽게 생각합니다. – Ankush

+0

Stack ... 조금 너무 설명해 주시겠습니까 .. – Bohn

1

간단한 트리 순회 알고리즘을 만들고 싶습니다. 다음은 의사 코드로 DFS (Depth first search)를 간단하게 구현 한 것입니다.

TraverseTree(Tree t) 
{ 
    DoSomethingWith(t); // like writing the contents of the node to the file. 

    if (t == null) // leaf 
    return; 

    foreach(Tree child in t.Children) // recursively traverse the children. 
    { 
     TraverseTree(child); 
    } 
} 

계산을 실행하는 순서대로 재생할 수 있습니다. 자세한 내용을 보시려면 here

+0

왜 투표가 중단 되었습니까? – Vitaliy

+0

나는 내 질문에 굵은 글씨로 "Tree"에 대해 생각하지 말아주세요. – Bohn

+0

@BDotA 당신은 재귀 적 방법의 구조에 대해 물었습니다. – Vitaliy