【问题标题】:Quickly remove duplicate strings from VBA Collection从 VBA 集合中快速删除重复的字符串
【发布时间】:2018-11-21 11:33:08
【问题描述】:
Dim MyCollection As VBA.Collection
Set MyCollection = New VBA.Collection

For i = MyCollection.Count To 1 Step -1
    For j = (i - 1) To 1 Step -1
        If MyCollection(i) = MyCollection(j) Then
            MyCollection.Remove i
            Exit For
        End If
    Next j
Next i

目前在 MyCollection 中有 8000 个电子邮件条目。我想从这个大列表中删除冗余元素,但速度更快。

如何加速这段代码?

【问题讨论】:

  • 800 万?那么800万?您的问题很难理解,但避免重复的最佳方法是在最初存储数据时使用字典对象而不是集合。 800 万条记录存储什么样的数据?您的方法需要多长时间?
  • 不是 800 万。这是一个错字。对我的问题进行了编辑。问题的要点是列表很大,这会产生滞后,因此希望加快进程。有更好的代码吗?

标签: string vba list collections


【解决方案1】:

我有建议,它很简单,必须案例它必须更有效。

原因有一些“但是”和主要的“但是”:

  • 你必须有足够的内存
  • 删除计数必须足够高

建议:不要逐个删除元素

而不是删除:创建新集合而不需要不需要的记录。

之后:将旧集合全部删除。

【讨论】:

  • 一切都取决于比率:删除计数越大,列表的重新创建就越有效。显然,您将有更少的插入,而不是删除,您将什么都不做。另一方面:如果您删除可笑的行数 - 删除根本不是问题,问题在于过滤。
  • 非常感谢您提供一个想法。我不确定“创建一个没有不需要记录的新集合”的含义。我的代码实际上试图做到这一点!怎么样:将列表分成许多较小的列表并删除每个列表的冗余。然后将列表合并为一个大列表,并删除此合并列表的冗余。这会更快吗?
  • 关于划分成越来越小的数据集:现代 RAM 子系统不喜欢很多小操作,当您将许多小操作组合成厚批次时会更好。
猜你喜欢
  • 2019-02-04
  • 1970-01-01
  • 2015-11-14
  • 2015-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-24
  • 2017-12-25
相关资源
最近更新 更多