我有一个属性设置为 true的 winformsTreeView
控件。我还通过为属性分配和实例来覆盖默认排序器。Sorted
IComparer
TreeViewNodeSorter
AddRange
不幸的是,使用该函数添加几千个节点可能需要 10 秒。如果我设置Sorted
为 false,则AddRange
函数小于 1/2 秒。(请不要讨论添加这么多节点的有效性)
啊哈,我听到你说.. 我的IComparer
对象有问题。不是根据探查器。几乎没有时间花在排序对象上,但该AddRange
函数位于慢速函数列表的顶部。
这个问题很容易在测试项目中复制。只需创建一个TreeNode
s 列表并使用该函数将其添加到现有的扩展树节点中AddRange
。这将在树文本上使用默认排序 - 再次慢得不成比例。
为了演示如果我Sorted
在测试 probject 中禁用该属性并在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()
调用