我有一個WinForms TreeView
控制與Sorted
property設置爲true。我還通過將IComparer
的實例分配給TreeViewNodeSorter
屬性來覆蓋默認分揀機。WinForm的樹狀分類屬性是慢
使用AddRange
功能需要也許10秒不幸的是增加了幾千個節點。如果我將Sorted
設置爲false,則AddRange
函數爲< 1/2秒。 (請不要討論添加這麼多節點的有效性)
啊哈我聽到你說..有我的IComparer
對象的問題。不是根據分析器。幾乎沒有任何時間花在排序對象上,但AddRange
函數正好位於慢函數列表的頂部。
的問題很容易在測試項目中進行復制。只需創建一個TreeNode
s的列表,並使用AddRange
函數將其添加到現有的展開樹節點。這將在樹形文本上使用默認排序 - 它又是不成比例的慢。
爲了證明它是多麼的特別慢,如果我禁用測試probject的Sorted
性能和使用List<T>.Sort
功能(與節點的文本比較委託)將它們添加到樹那裏之前我的節點列表幾乎沒有任何延遲。
這導致排序的節點的替代方法使用AddRange
之前手動。沒關係,但是在將節點添加到現有的一組子節點時,這意味着需要進行大量工作才能找到正確的插入點,而不是簡單地將Sorted
設置爲true。
無論如何加快行爲?
編輯 - 看來唯一的辦法就是增加前整理..它是有點麻煩,但我想出了下面的擴展方法:
public static void AddSortedRange(this TreeNodeCollection existingNodes, IList<TreeNode> nodes, TreeView treeView, IComparer sorter)
{
TreeNode[] array = new TreeNode[nodes.Count + existingNodes.Count];
existingNodes.CopyTo(array, 0);
nodes.CopyTo(array, existingNodes.Count);
Array.Sort(array, sorter);
treeView.BeginUpdate();
existingNodes.Clear();
existingNodes.AddRange(array);
treeView.EndUpdate();
}
這是更快現有節點複製到一個數組,追加新的節點,該數組排序,然後替換試圖操縱樹視圖節點在線 - 在上面的代碼中最慢的操作是你都跟事實existingNodes.Clear()
呼叫
如何排序_before_加入? – 2012-08-16 11:52:29
只有在添加了所有節點後,您才能將Sorted設置爲true嗎? – ken2k 2012-08-16 11:54:58
@UweKeim - 如問題中所述,在現有的一組節點中插入節點是相當多的額外工作 - 特別是將範圍合併到現有集合 – 2012-08-16 12:04:09