首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >VirtualTreeview:何时对子项进行排序?

VirtualTreeview:何时对子项进行排序?
EN

Stack Overflow用户
提问于 2010-03-10 11:39:55
回答 2查看 1.7K关注 0票数 2

我依赖VirtualTreeView来显示数以千计的项目,这些项目偶尔会发生变化,当这种情况发生时,会再次清理和填充树。

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

那么当toAutoSort关闭时,我应该在什么时候调用.Sort方法呢?(DoInitChildren看起来很合理,但我偶尔会得到奇怪的结果,比如颠倒结果,所以我认为这不是对孩子进行排序的好事件。)

EN

回答 2

Stack Overflow用户

发布于 2010-03-10 11:54:52

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

票数 4
EN

Stack Overflow用户

发布于 2010-03-11 01:02:01

除非整个树每次都完全不同,否则可以通过不清除树,而是单独构建一个新的项目列表(只是标识项目),对该列表进行排序,然后按顺序遍历这两个树来获得更好的性能。一般的算法如下所示(左边的列表是“新列表”,右边的列表是“现有列表”):

代码语言:javascript
复制
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步骤中的项目加载。在树中,无论何时匹配,都会为孩子运行类似的例程。这个概念与现有列表中的项不会有太大变化或完全加载的代价可能很高的事实进行了权衡。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2414360

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档