2009-07-06 7 views
1

私はWPFで作業していますが、豊富な機能を持つツリーなどで構成される複雑なusercontrolを開発しています。 この目的のために、一部の操作を直接達成できないため、View-Modelデザインパターンを使用しましたWPFで。だから私はこの問題は、このコンストラクタは約3秒かかるということである再帰的/スタック使用(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); 
     } 

(ノードであり、ツリー構造を作成するには、このコンストラクタに渡し)IHierarchyItemを取ります!私のデュアルコア上の200アイテム。 私はanythigを間違っているか再帰的なコンストラクタ呼び出しを行うのが遅いですか? ありがとうございます!

+0

上記の内容はすべて正しいです。この問題はhierarchyItem.Childrenに存在し、時間がかかりすぎていました。 –

答えて

3

特に少数のアイテムの場合、ツリーの再帰的な実装には何も問題はありません。再帰的な実装は時には空間効率が悪く、時間効率もわずかですが、コードの明瞭さが原因です。

コンストラクタで簡単なプロファイリングを行うと便利です。からの提案のいずれかを使用して:http://en.csharp-online.net/Measure_execution_timeあなたは、それぞれの作品がどれくらいの時間を取っているかを自分で示すことができます。

特に1枚が長時間かかる可能性があります。いずれにせよ、それはあなたが本当に時間を費やしている場所を絞り込むのに役立ちます。

+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のためのちょっとしたお勧め:あなたがそんなに傾いているならば、あなたは幅優先横断のためにキューを使うことができます。スタックは深さ優先のトラバーサルを作成します。 –