在我的自定义TreeView控件上做一些最终优化,看起来我可以进一步优化加载方法。这是我关注的部分,我觉得可以通过首先构建所有TreeNodes,然后使用单个TreeView.AddRange( nodes[] )
方法来优化它。
// Create hierarchy and load into view
foreach (var id in _treeNodes.Keys)
{
var node = GetNode(id);
var obj = (T)node.Tag;
var parentId = getParentId(obj);
if (parentId.HasValue)
{
var parentNode = GetNode(parentId.Value);
if(parentNode == null)
{
Invoke((MethodInvoker)(() => Nodes.Add(node)));
} else
{
Invoke((MethodInvoker)(() => parentNode.Nodes.Add(node)));
}
}
else
{
Invoke((MethodInvoker)(() => Nodes.Add(node)));
}
}
_treeNodes
是Dictionary<ulong, TreeNode>
GetNode()
是:
if(_treeNodes.ContainsKey(id))
{
return _treeNodes[id];
} else
{
return null;
}
getParentId()
是代理人Func<NtfsUsnJournal.UsnEntry, ulong?> getParentId = (x => x.ParentFileReferenceNumber)
代码当前从字典列表获取所有值,这是NTFS Journal中的所有目录,这种情况发生得非常快。延迟是在每个Node
和子节点上,它被直接添加到TreeView。
我想要做的是构建一个根节点列表(当然包含所有子节点),然后将其作为TreeNode[]
的数组传递给.AddRange( TreeNode[] )
方法Invoke()
。
如何修改此代码以实现此目的?
答案 0 :(得分:0)
想出来,答案是盯着我的脸:
List<TreeNode> _t = new List<TreeNode>();
foreach (var id in _treeNodes.Keys)
{
var node = GetNode(id);
var obj = (T)node.Tag;
var parentId = getParentId(obj);
if (parentId.HasValue)
{
var parentNode = GetNode(parentId.Value);
if(parentNode == null)
{
_t.Add(node);
} else
{
parentNode.Nodes.Add(node);
}
}
else
{
_t.Add(node);
}
}
Invoke((MethodInvoker)(() => Nodes.AddRange(_t.ToArray())));