我该怎么做才能改进以下代码,以便结果是单个`TreeView.AddRange()`

时间:2016-08-10 08:39:05

标签: c# winforms treeview

在我的自定义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)));
    }
}

_treeNodesDictionary<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()

如何修改此代码以实现此目的?

1 个答案:

答案 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())));