我们说我有一个UDT集合。我把它填充如下:
public type udtEmp
Id as long
Name as string
end type
dim col as new Collection
dim empRec as udtEmp, empDummy as udtEmp
for n = 1 to 100000
empRec = empDummy ' reset record
emp.Id = n
emp.Name = "Name " & n
col.add emp, cstr(emp.Id)
next
现在我想循环它。我使用Long数据类型作为.Item()
的索引dim n as long
For n = 1 To 100000
emp = col.Item(n)
Next
上面的代码可行,但它确实很慢 - 需要10,000毫秒才能进行迭代。如果我通过密钥访问集合,它会快得多 - 78毫秒。
For n = 1 To 100000
emp = col.Item(cstr(n))
Next
问题在于,当我迭代收集时,我没有钥匙。如果我有一个对象集合而不是UDT,我可以for each obj in col
,但是使用UDT,它不会让我以这种方式迭代。
我的一个想法是有一个索引和键的二级集合指向主集合,但我尽量不要使代码复杂化,除非我绝对必须。
那么我的选择是什么?
答案 0 :(得分:1)
代码的优雅或性能是您必须做出的严肃决定。选择应该基于结果的影响。 for each
优雅但很慢,并且与对象和类一起使用。但如果速度是一个主,那么使用UDT和数组。
在你的情况下,我认为一系列UDT最适合你的情况。为了获得更快的速度,尝试使用SAFE_ARRAY
访问数组(你可以谷歌搜索它),结果令人印象深刻。
答案 1 :(得分:1)
您可以使用用户类型的类集合。它将提供具有出色性能的for-each迭代功能。
实现这一目标的最简单方法是通过Class Builder Utility(https://msdn.microsoft.com/en-us/library/aa442930(v=vs.60).aspx)。您可能需要首先运行加载项管理器并加载类构建器实用程序。 (我认为在安装vb6 / vs6时有关于这些功能的安装选项?因此,如果您没有在加载项管理器中看到类构建器实用程序,则可能是由于此原因)。 / p>
要使用类构建器实用程序匹配您的udt示例,首先添加一个类(例如:Employee),它具有两个属性(例如:EmpId和EmpName,分别为long和字符串类型)。然后根据Employee类添加一个集合(例如:Employees)。将其保存到项目(将创建两个新的类模块)并关闭实用程序。
现在,您可以创建新的Employees集合,加载它,并通过索引,密钥或for-each迭代它。 (注意:不要使用纯数字作为密钥 - 通过纯数字的密钥请求项目,即使是字符串,也会被解释为索引请求,它会很慢而且你会可能无法获得所需的项目)
此外 - 一旦创建了新类,您就可以为它们添加自定义属性和方法,以处理您可能需要的各种花哨的东西。
Dim i As Long
Dim Emp As Employee
Dim colEmp As New Employees
Dim name As String
' Loading
For i = 1 To 100000
colEmp.Add i, "name" & CStr(i), "key" & CStr(i)
Next i
' iterate with index
For i = 1 To 100000
Set Emp = colEmp(i)
name = Emp.EmpName
Next i
' iterate with key
For i = 1 To 100000
Set Emp = colEmp("key" & i)
name = Emp.EmpName
Next i
'iterate with for-each
For Each Emp In colEmp
name = Emp.EmpName
Next Emp
计时
在我的系统上输入上述代码:
装载时间:1秒
索引时间:20秒
关键时间:0.29秒
每次:0.031秒