加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

在Delphi中有效地填充组合框

发布时间:2020-12-15 09:41:01 所属栏目:大数据 来源:网络整理
导读:需要在TComboBox中添加许多项目(超过10k)(我知道TComboBox不应该包含很多项目,但不能由我来改变它)而不添加重复项. 所以我需要在添加之前搜索完整列表.我想避免使用TComboBox.items.indexof,因为我需要二进制搜索,但二进制查找在TStrings中不可用. 所以我创
需要在TComboBox中添加许多项目(超过10k)(我知道TComboBox不应该包含很多项目,但不能由我来改变它)而不添加重复项.
所以我需要在添加之前搜索完整列表.我想避免使用TComboBox.items.indexof,因为我需要二进制搜索,但二进制查找在TStrings中不可用.

所以我创建了一个临时的Tstringlist,设置排序为true并使用find.但现在将临时Tstringlist分配回TComboBox.Items

(myCB.Items.AddStrings(myList))

复制整个列表真的很慢.有没有办法移动列表而不是复制它?或者以其他方式高效填充我的TComboBox?

解决方法

正如Rudy Velthuis已经在评论中提到并假设您正在使用VCL,CB_INITSTORAGE消息可能是一个选项:

SendMessage(myCB,CB_INITSTORAGE,myList.Count,20 * myList.Count*sizeof(Integer));

其中20是你的平均字符串长度.

结果(在i5-7200U和20K项目上随机长度在1到50个字符之间):

>没有CB_INITSTORAGE:~265ms
>使用CB_INITSTORAGE:~215ms

因此,虽然通过预先分配内存可以加快一些事情,但更大的问题似乎是糟糕的用户体验.用户如何在具有如此多项目的组合框中找到正确的元素?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读