1

我正在使用 WPF,并且正在开发一个复杂的用户控件,它由具有丰富功能的树等组成。为此,我使用了 View-Model 设计模式,因为某些操作无法直接在 WPF 中实现。所以我采用 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 回答