1

私は WPF を使用しており、豊富な機能を備えたツリーなどで構成される複雑なユーザー コントロールを開発しています。この目的のために、WPF で直接実行できない操作があるため、View-Model デザイン パターンを使用しました。そこで、IHierarchyItem (ノードであり、このコンストラクターに渡してツリー構造を作成します) を取得します。

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 秒かかることです!! 私のデュアルコアで200アイテム。私は何か間違ったことをしていますか、それとも再帰的なコンストラクター呼び出しは遅いですか? どうもありがとうございました!

4

2 に答える 2

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);                    

}
于 2009-07-15T12:39:41.567 に答える
3

特にそのような少数のアイテムの場合、ツリーの再帰的な実装に問題はないはずです。再帰的な実装は、スペース効率が低く、時間効率がわずかに低い場合がありますが、コードの明確さがそれを補うことがよくあります。

コンストラクターで簡単なプロファイリングを実行すると便利です。http://en.csharp-online.net/Measure_execution_timeからの提案のいずれかを使用して、各ピースにかかる時間を自分で示すことができます。

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

于 2009-07-06T13:30:26.410 に答える