TListbox排序 - 高点和低点

1 delphi sorting shuffle

好的,我有一个TListBox,有时可能会被要求显示43,000行!

我知道,这几乎没有任何意义,但确实如此.

现在这是当前的问题:

使用内置的Sort方法及其Compare回调函数几乎可以永久使用,就像很多分钟一样.

因此,我将列表框中的字符串从ShortStrintgs的普通旧动态数组中提取出来,对其执行QuickSort(),大约需要三秒钟.我想是啊!

做一点思考,我看到QuickSort正在移动所有这些字符串,这是不需要的,所以我将代码移动到指针或索引到字符串,瞧,排序再快一点,羚牛在一秒钟内排序43,000项.大赢,是吗?

但是,现在,如果我执行LB.Items.Add()或LB.Items.Assign将已排序的字符串移动到列表框中,则需要30秒!即使发生了BEgin/EndUpdate.如果我浏览代码,我会看到很多东西正在继续使用delete()Insert()INsertObject()和Windows消息没有任何理由.

片刻虽然揭示了我拥有LB.TStrings中的所有字符串,但我只需要将它们拖到我的QuickSorted()数组周围.这应该是微不足道的,只是移动一些指针.

但我没有看到任何可见的方法来设置原始TStringList指针.不,Exchange()真的很慢.

我有什么想法可以获得TString字符串指针?这应该是微不足道的,但我没有看到它.

谢谢,

乔治

Mas*_*ler 5

所有这些消息实际上是飞来飞去的一个很好的理由.没有魔法"显示列表中的任何内容"功能.它必须获取列表的内容,从中构建一个树,一次一个项目,并显示该树的任何部分恰好落在可视控件的ClientRect中.你的外部字符串列表技术听起来像你将获得的最快的东西.

如果您想获得更好的性能,请尝试查看更快的列表框.我听说Virtual TreeView在添加大批新产品方面非常快,但我不能真正推荐它,因为我没有使用它并自己进行测试.但您可能需要查看一下,看看它是否比您现有的设置更适合您的需求.