2009-07-06 4 views
1

WPF로 작업 중이며 다양한 기능을 갖춘 트리로 구성된 복잡한 usercontrol을 개발 중입니다. 일부 작업을 직접 수행 할 수 없기 때문에이 목적을 위해 View-Model 디자인 패턴을 사용했습니다. WPF에서. 그래서재귀/스택 사용이없는 트리 순회 (C#)?

private IHierarchyItemViewModel(IHierarchyItem hierarchyItem, IHierarchyItemViewModel parent) 
     { 
      this.hierarchyItem = hierarchyItem; 
      this.parent = parent;  

      List<IHierarchyItemViewModel> l = new List<IHierarchyItemViewModel>(); 
      foreach (IHierarchyItem item in hierarchyItem.Children) 
      { 
       l.Add(new IHierarchyItemViewModel(item, this)); 
      } 
      children = new ReadOnlyCollection<IHierarchyItemViewModel>(l); 
     } 

문제이 생성자는 약 3 초 정도 소요입니다 (트리 구조를 생성하는 노드 인이 생성자에 전달)을 IHierarchyItem을! 내 듀얼 코어에 200 개의 항목이 있습니다. anythig 잘못했거나 재귀 생성자 호출을하는 것이 느린 것인가? 대단히 감사합니다!

+0

위의 모든 내용이 맞습니다. 문제는 너무 오래 걸리면서 hierarchyItem.Children에있었습니다. –

답변

3

특히 작은 수의 항목에 대해서는 트리를 재귀 적으로 구현할 때 문제가 없어야합니다. 재귀 적 구현은 때로 공간 효율성이 적고 시간 효율성이 약간 떨어지지 만 코드 명료성으로 인해 종종이를 보충합니다.

생성자에서 간단한 프로파일 링을 수행하는 것이 유용 할 것입니다. 다음 중 하나의 제안을 사용하면 : http://en.csharp-online.net/Measure_execution_time 각 조각이 얼마나 오래 복용하고 있는지 나타낼 수 있습니다.

특히 한 장이 오래 걸릴 가능성이 있습니다. 어쨌든, 그것은 당신이 정말로 시간을 보내는 곳을 좁힐 수 있습니다.

+0

고마워요, 제가 그 발췌 부분을 시도 할거예요. 아마 맞을 것입니다. 오래 걸릴 수는 없지만, 문제는 특정 항목의 어딘가에있을 수 있습니다. –

+0

int이 줄 : foreach (hierarchyItem.Children의 IHierarchyItem 항목) hierarchyItem.Children이 너무 오래 걸렸습니다. –

4

확인 스택을 사용하지만 직접 재귀 적이 아닌 버전을 발견했습니다. 전체 트리를 가로 지르며 :

Stack<MyItem> stack = new Stack<MyItem>(); 

stack.Push(root); 

while (stack.Count > 0) 
{ 
    MyItem taken = stack.Pop(); 

    foreach (MyItem child in taken.Children)     
     stack.Push(MyItem);      

} 
+0

googler를위한 작은 참고 사항 : 너가 너무 기울이면 너비 우선 탐색을 위해 대기열을 사용할 수 있습니다. 스택은 깊이 우선 탐색을 만듭니다. –