2009-07-06 84 views
1

我正在使用WPF,我正在开发一个复杂的用户控件,它由一个具有丰富功能的树组成。 为此,我使用了View-Model设计模式,因为有些操作无法直接实现在WPF中。所以,我把IHierarchyItem(这是一个节点,并把它传递给这个构造函数来创建一个树形结构)没有递归/堆栈使用(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秒钟的问题! 200个项目在我的双核上。 我做任何错误或递归的构造函数调用是慢? 非常感谢!

+0

确定上面的所有内容都是正确的。问题存在于hierarchyItem.Children中,因为它耗时太长。 – 2009-07-15 13:28:23

回答

3

树的递归实现应该没有问题,尤其是对于这样一小部分的项目。递归实现有时候更节省空间,而且时间效率稍低,但代码清晰度通常弥补了这一点。

对你来说,对你的构造函数执行一些简单的分析将会很有用。使用以下建议之一:http://en.csharp-online.net/Measure_execution_time您可以指出每件作品需要多长时间。

有可能一件特别是需要很长时间。无论如何,这可能会帮助你缩小你真正花时间在哪里。

+0

谢谢,我会试试这个片段..你可能是对的,它不能再花那么长时间,问题可能在特定项目的某个地方。 – 2009-07-06 13:42:34

+0

int this line:foreach(hierarchyItem.Children中的IHierarchyItem项) hierarchyItem.Children花了太长时间。 – 2009-07-15 13:29:08

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

}