VirtualTreeview:何时对孩子进行排序?

VirtualTreeview:何时对孩子进行排序?

问题描述:

我靠VirtualTreeView显示数以千计这必将偶尔会发生变化,当这种情况发生的树被清理和重新填充项目。VirtualTreeview:何时对孩子进行排序?

排序是自动完成的(toAutoSort标志设置),但这会产生不希望的递归初始化所有节点的效果,这是一个非常昂贵的操作,正如您可以想象的那样。

所以,当我应该叫.Sort方法时toAutoSort熄灭? (DoInitChildren看起来貌似合理,但我得到了奇怪的结果,例如偶尔会出现颠倒的结果,所以我认为这对孩子们来说不是一件好事。)

这种情况下的一般规则是在添加所有新项目后进行排序。这样你只能排序(并初始化)一次。

+0

有没有“新”项目说。该树是简单地修补和重建(如备份树中的数据结构在我的情况完全改变)。 – 2010-03-10 04:32:06

+1

“重建”树等价于创建一个新的。原理是一样的:暂停排序,开始施工,添加所有节点,结束施工,然后排序。 – 2010-03-10 05:05:39

除非整个树是完全不同的每一次,你可以不清除树获得更好的性能,而是通过单独建设项目的一个新的列表(只是鉴定的项目),分选名单,然后步行两棵树为了...的一般算法看起来像这样(在左边的列表是“新名单”,右侧列表是“现有列表”):

LeftCur := 0; 
RightCur := 0; 
while (LeftCur < TotalLeft) and (RightCur < TotalRight) then 
    begin 
    if LeftList[LeftCur] = RightList[RightCur] then 
     begin 
     // matches, so just advance 
     Inc(LeftCur); 
     Inc(RightCur);    
     end 
    else if LeftList[LeftCur] < RightList[RightCur] then 
     begin 
     // insert happens BEFORE RightCur 
     InsertLeftItemToRight; 
     Inc(RightCur); 
     Inc(TotalRight); 
     end 
    else if LeftList[LeftCur] > RightList[RightCur] then 
     begin 
     DeleteRightItem; 
     Dec(TotalRight); 
     end; 
    end; 
    While RightCur < TotalRight do 
    begin 
     DeleteRightItem; 
     Dec(TotalRight); 
    end; 
    While LeftCur < TotalLeft do 
    AppendLeftItemToRight; 

这样的列表保持排序,并且你只需要在InsertLeftItemToRight步骤中完成加载项目。在树上,每当你匹配时,你就为孩子们运行一个类似的例程。这个概念被压向一个事实,即在现有列表项都不会有太大变化或可能是昂贵的完全负载。

+0

感谢您的详细解答,但VirtualTreeView是如此快速,简单的清除/重新加载策略似乎就够了。 (显然除了排序虽然:) – 2010-03-10 22:45:30