参考一:
VB之Collection---Collection集合类
你看到的这个文章来自于http://www.cnblogs.com/ayanmw
由于要对一些数据进行处理,比较麻烦,实现某个算法要处理大量不同的不同类型的数据。
所以考虑到一些因素,又在使用VB6(可惜微软不支持VB6了,改为DotNet框架了 ),所以使用 VB6 自带的 Collection集合(类) 最好。
其实Collection 也是有Key 和 Value一一对应的关系的。而且 还有 ID 顺序。
现在不是流行 key-value的数据库么,collection如果可以保存到文件,那么不久完美了么?? 反正 现在当作 key value的实时处理数据的库来用 还是很好的。
从VB6的 《类生成器实用工具》 创建 collection挺方便,唯一不方便的是,默认不把 collection当作类来使用。其实 这就是一个类而已么。一般collection只有一个就行,add多个元素。但是collection也可以 创建多个,就是collection下有collection,下又有 一些 class,复杂程度稍微高一点。
下面是一个简单的collection配合一个class的例子。
'FileName : OneKeyCls.cls
Option Explicit Public Key As String
'FileName : OneKeyCol.cls
Option '局部变量,保存集合 Private mCol As Collection Public Function Add(Key String,Optional sKey String) As OneKeyCls 创建新对象 Dim objNewMember Set objNewMember = New OneKeyCls 设置传入方法的属性 objNewMember.Key = Key If Len(sKey) = 0 Then mCol.Add objNewMember Else mCol.Add objNewMember,sKey End If 返回已创建的对象 Set Add = objNewMember Nothing End Function 下面 做了 错误处理!当 没有 关键字 的时候 就会返回Nothing了。 Property Get Item(vntIndexKey As Variant) As OneKeyCls Err.Clear On Error GoTo GetItemError 引用集合中的一个元素时使用。 vntIndexKey 包含集合的索引或关键字, 这是为什么要声明为 Variant 的原因 语法:Set foo = x.Item(xyz) or Set foo = x.Item(5) Set Item = mCol(vntIndexKey) Exit Property GetItemError: Debug.Print Err.Source & " : Error Was found in Item(vntIndexKey as Variant) as oneKeyCls . " & vbCrLf & Err.Description & : " & Err.Number Set Item = Nothing End Property Get Count() Long 检索集合中的元素数时使用。语法:Debug.Print x.Count Count = mCol.Count End Property Sub Remove(vntIndexKey As Variant) 删除集合中的元素时使用。 vntIndexKey 包含索引或关键字,这是为什么要声明为 Variant 的原因 语法:x.Remove(xyz) mCol.Remove vntIndexKey End Sub Get NewEnum() As IUnknown 本属性允许用 For...Each 语法枚举该集合。 Set NewEnum = mCol.[_NewEnum] Private Sub Class_Initialize() 创建类后创建集合 Set mCol = New Collection Sub Class_Terminate() 类终止后破坏集合 End Sub
使用范例:
Dim Cars New OneKeyCol Cars.Add 10.1",2" Cars.Add 10.22010.3200key" Debug.Print Count:" & Cars.Count Debug.Print Cars.Item(").Key Debug.Print TypeName(Cars.Item(300")) Error Nothing Dim i Dim key1 按照 index 索引 进行遍历,效率要比下面的方法低一点 For i = 1 To Cars.Count Set key1 = Cars.Item(i) Debug.Print key1.Key Next 推荐这种遍历方法 For Each key1 In Cars Debug.Print key1.Key Next
一下为稍微整理下VB6的 collection 的转载。
Visual Basic 集合对象()
集合是方法将一系列相关的项构成组的一种方法。Visual Basic 中集合可用于跟踪很多事情,例如程序中加载的窗体(窗体集合),或者在窗体中的所有控件(控件集合)。
Visual Basic 提供的类属 Collection 类可用来定义自己的集合。需要多少集合对象,就可以建立多少 Collection 对象- 即 Collection 类的实例。还可使用集合对象作为自己的集合类和对象模型的基础,它将在本章后面的“创建自己的集合类”和“对象模型”中讨论。
例如,集合是跟踪多窗体的最好方法。在“创建用户界面”中的“多文档界面 (MDI) 应用程序”里讨论用户可以打开任何数目文档窗口的应用程序。以下代码段演示如何使用集合对象的 Add 方法,对用户建立的 MDI 子窗体列表进行管理。该代码假定已经存在一个名为 mdiDocument 的窗体,其 MDIChild 属性设置为 True。
'父 MDIForm 中的模块级集合。
colDocuments 的作用象是内置窗体集合的一个子集,它只包含窗体 mdiDocument 的一些实例。每添加一个新窗体,自动调节集合的大小。可使用 For Each ... Next 在集合内进行迭代。如果赋予窗体一个可以检索的键,那么可提供一文本字符串作为 Add 方法的第二个参数,如本节后面部分所述。
在变量 colDocuments 的声明中,New 关键字导致当该变量第一次被引用时,在代码中创建集合对象。因为集合是类,而不是数据类型,所以必须建立集合实例,并且在变量中记录对该实例(对象)的引用。
象其它任何对象一样,当包含其引用的最后一个变量被设置成 Nothing 或不可见时,Collection 对象将被撤消。它包含的所有对象引用将被释放。因此,变量 colDocuments 在父 MDIForm 中声明,于是它将存在于程序存活期中的整个过程。
注意 如果使用集合来跟踪窗体,当窗体被卸载之后,应使用集合的 Remove 方法从集合中删除该对象引用。只要对该窗体的引用仍然存在,就不能收回窗体使用的内存,并且 Collection 对象保存的引用象对象变量中的引用一样完好。
集合对象的构成
Collection 对象将每一项存储于 Variants 对象中。于是,能够添加到 Collection 对象里的内容列表就和能够存储到 Variants 中的内容列表是相同的。这包括标准数据类型、对象和数组- 但不包括用户定义类型。
不管 Variants 中存储的是什么,它都占 16 字节,因此使用 Collection 对象不如使用数组的效率高。然而,不能 ReDim 一个 Collection 对象,ReDim Collection对象能够使代码更清楚、更容易维护。此外,集合对象按键能进行快速的查找,而数组却不能。
注意 准确一点说,即使是把数据存储在其它地方,Variants 也总是只占 16 个字节。例如,如果把字符串或数组赋给 Variants,Variants 将包含一个指向字符串和数组数据备份的指针。在 32 位系统中,指针只使用了 Variants 的 4 个字节,而且 Variants 中实际上不存在数据。
若要存储一个对象,Variants 将包含该对象引用,就象对象变量所做的一样。对字符串和数组来说,也只使用 Variants 的 4 个字节。
数字数据类型存储在 Variants 中。不管什么样的数据类型,Variants 仍然占 16 个字节。
除了 Variants 大小之外,还有很多情况需要使用 Collection 对象来存储上面列出的所有数据类型。应该知道进行权衡:使用 Collection 对象能够编写清楚且容易维护的代码- 所花费的仅是将一些项存储在 Variant 中。
每个集合对象都有属性和方法,使用它们能够插入、删除和检索该集合中的项。
这些属性和方法仅仅是集合最基本的功能。例如,要确保集合只包含一种对象,Add 方法并不能检查将要添加到集合里的对象类型。通过建立自己的集合类能够提供更强健的功能,以及额外的属性、方法和事件,正如本章后面的“创建自己的集合类”中所述。
集合中的增加、删除和检索的基本功能需要关键字和索引。关键字是一个 String 的值。它可以是能转换成字符串的名字、驾驶执照号、社会安全号或者简单的整数。Add 方法允许将关键字与项相关联,如本节后面部分所述。
索引是长整型,介于 1 和集合中项的数目之间。使用 before 和 after 命名的参数,可以控制项索引的初始值,但是随着其它项的增加和删除,其值会发生改变。
注意 索引从 1 开始的集合称为基于 1,如“Visual Basic 中的集合”中所述。
使用索引能够在进行集合的项中迭代。例如,假定变量 mcolEmployees 中包含对集合对象的一个引用,下列代码使用两种方法把 Employee 对象集合中所有雇员的薪水提高 10%。