我正在使用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个项目。 我做anythig错误或递归构造函数调用是那么慢? 非常感谢你!
答案 0 :(得分:4)
好吧我自己发现了一个非递归版本,虽然它使用了Stack。 它遍历整棵树:
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);
}
答案 1 :(得分:3)
树的递归实现应该没有任何问题,特别是对于这么少的项目。递归实现有时候空间效率较低,而且时间效率稍差,但代码清晰度通常会弥补它。
对构造函数执行一些简单的分析会很有用。使用以下建议之一:http://en.csharp-online.net/Measure_execution_time您可以自己指出每件作品的使用时间。
特别是一件作品可能需要很长时间。在任何情况下,这可能会帮助您缩小您真正花时间的地方。