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 Explicit '局部变量,保存集合
Private mCol As Collection Public Function Add(Key As String, Optional sKey As String) As OneKeyCls
'创建新对象
Dim objNewMember As OneKeyCls
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
Set objNewMember = Nothing End Function '下面 做了 错误处理!当 没有 关键字 的时候 就会返回Nothing了。
Public 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 Public Property Get Count() As Long
'检索集合中的元素数时使用。语法:Debug.Print x.Count
Count = mCol.Count
End Property Public Sub Remove(vntIndexKey As Variant)
'删除集合中的元素时使用。
'vntIndexKey 包含索引或关键字,这是为什么要声明为 Variant 的原因
'语法:x.Remove(xyz) mCol.Remove vntIndexKey
End Sub Public Property Get NewEnum() As IUnknown
'本属性允许用 For...Each 语法枚举该集合。
Set NewEnum = mCol.[_NewEnum]
End Property Private Sub Class_Initialize()
'创建类后创建集合
Set mCol = New Collection
End Sub Private Sub Class_Terminate()
'类终止后破坏集合
Set mCol = Nothing
End Sub
使用范例:
Dim Cars As New OneKeyCol
Cars.Add "10.1", "2"
Cars.Add "10.2", "20"
Cars.Add "10.3", "200"
Cars.Add "key"
Debug.Print "Count:" & Cars.Count Debug.Print Cars.Item("200").Key
Debug.Print TypeName(Cars.Item("300")) ' Error Nothing Dim i
Dim key1 As OneKeyCls
'按照 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 中的模块级集合。
Public colDocuments As New Collection
'建立新的 MDI 子文档窗体的代码。
Private Sub mnuFileNew()
Dim f As New mdiDocument
Static intDocumentNumber As Integer
intDocumentNumber = intDocumentNumber 1
'下面的语句创建窗体。
f.Caption = "Document" & intDocumentNumber
'给集合添加对象引用。
colDocuments.Add f
f.Show
End Sub
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 方法 给集合添加项。
Count 属性 返回集合中项的数目。只读。
Item 方法 通过索引或关键字,返回项。
Remove 方法 通过索引或关键字,从集合中删除项。
这些属性和方法仅仅是集合最基本的功能。例如,要确保集合只包含一种对象,Add 方法并不能检查将要添加到集合里的对象类型。通过建立自己的集合类能够提供更强健的功能,以及额外的属性、方法和事件,正如本章后面的“创建自己的集合类”中所述。
集合中的增加、删除和检索的基本功能需要关键字和索引。关键字是一个 String 的值。它可以是能转换成字符串的名字、驾驶执照号、社会安全号或者简单的整数。Add 方法允许将关键字与项相关联,如本节后面部分所述。 索引是长整型,介于 1 和集合中项的数目之间。使用 before 和 after 命名的参数,可以控制项索引的初始值,但是随着其它项的增加和删除,其值会发生改变。 注意 索引从 1 开始的集合称为基于 1,如“Visual Basic 中的集合”中所述。 使用索引能够在进行集合的项中迭代。例如,假定变量 mcolEmployees 中包含对集合对象的一个引用,下列代码使用两种方法把 Employee 对象集合中所有雇员的薪水提高 10%。
Dim lngCt As Long
For lngCt = 1 To mcolEmployees.Count
mcolEmployees(lngCt).Rate = _
mcolEmployees(lngCt).Rate * 1.1
Next
Dim emp As Employee
For Each emp In mcolEmployees
emp.Rate = emp.Rate * 1.1
Next
提示 为改善性能,应使用 For Each 对 Collection 对象中的项进行迭代。使用 For Each 迭代要比使用索引快很多倍。这并不是对所有集合都正确- 它取决于集合内部存储数据的方法。
给集合添加项 Add 方法用于将项添加到集合。语法是:
Sub Add (item As Variant [, key As Variant] [, before As Variant]
[, after As Variant] )
例如,使用工作定单 ID 属性作为关键字,将工作定单对象添加到工作定单集合里,代码可编写为:
colWorkOrders.Add woNew, woNew.ID
这里假定 ID 属性是字符串。如果属性是数字(例如 Long),则应使用 CStr 函数将它转换成关键字所要求的字符串值:
colWorkOrders.Add woNew, CStr(woNew.ID)
Add 方法支持命名的参数。为了添加一项作为第三个元素,代码可编写为:
colWorkOrders.Add woNew, woNew.ID, after:=
可以使用 before 和 after 命名的参数管理有序的对象集合。例如,before:=1 将在集合的开始插入一项,因为集合对象是基于 1 的。
从集合中删除项 Remove 方法用于从集合中删除项。语法是:
object.Remove index
index 参数可以是所删除项在集合中的位置,或者是该项的关键字。如果集合中第三个元素的关键字是“W017493”,则可使用这两条语句中的任何一条删除它:
colWorkOrders.Remove 3
- 或 -
colWorkOrders.Remove "W017493"
从集合中检索项
Item 方法用于从集合中检索特定项。语法是:
[Set] variable = object.Item(index)
和 Remove 方法一样, index 可以检索项在集合中的位置,或者是该项的关键字。使用 Remove 方法中的相同示例,这两条语句中的任一条都可检索集合中的第三个元素:
Set woCurrent = colWorkOrders.Item(3)
- 或 -
Set woCurrent = colWorkOrders.Item("W017493")
如果使用整数作为关键字,在将它们传递到 Item 或 Remove 方法之前,必须使用 CStr 函数将其转换成字符串。通常集合对象都假定整数是索引。
提示 Collection 对象不能决定所传递的值是索引还是键。如果想把值解释为键,并且包含该值的变量是除 String 以外的任何值,可以使用 CStr 函数进行转换。如果想把值解释为索引,并且包含该值的变量不是整型数据类型中的一种,使用 CLng 进行转换。 Item 是缺省方法 对于集合对象来说,Item 方法是缺省方法,因此当访问集合中的项时,可忽略它。所以前面的代码示例也可以写成:
Set woCurrent = colWorkOrders(3)
- 或 -
Set woCurrent = colWorkOrders("W017493")
重点 当添加和删除集合对象元素时,集合对象会自动地维护其数字索引编号。因此给定元素的数字索引随之改变。不能在程序中存储数字索引值,并用它检索同一个元素。为达到该目的,应使用键。
使用 Item 方法调用属性和方法 为了使用对象引用,不能从集合中检索该对象引用,并把它放到对象变量中。当对象仍然在集合里时能够使用其引用。 例如,假设上述代码中的 WorkOrder 对象具有 Priority 属性。下面的语句都可用于设置工作定单的优先级:
colWorkOrders.Item("W017493").Priority = 3
colWorkOrders("W017493").Priority =
可行的原因是 Visual Basic 要从左到右计算表达式。当遇到 Item 方法时- 显式的或隐式的- Visual Basic 为指定的项(此时是键为 W017493 的 WorkOrder 对象)取得一个引用,并使用该引用计算该行的其余部分。
提示 如果想调用集合中对象的多个属性或方法,首先将该对象引用复制到一个强类型的对象变量中。把引用放到一个强类型的对象变量中,然后使用,比使用集合里对象的引用要快(例如,Dim woCurrent As WorkOrder),因为 Collection 对象是把项存储在 Variants 中。 Variants 中的对象引用总是最后绑定。 详细信息 对很多一般的程序设计任务来说,集合对象也是数组的很有用的可选方案。 请参阅“再论编程”中的“用集合替代数组”。 Visual Basic 提供很多内置集合。有关它们与集合对象的比较,请参阅“Visual Basic 中的集合”。
创建自己的集合类
一般可以采取三种办法用集合来实现对象包含。以上面“对象模型”中所讨论的 SmallBusiness 对象的 Employees 集合为例。为了实现该集合,可以这样做: 在 SmallBusiness 类模块中,将 Employees 变量声明为 As Collection,并使之成为 Public。这是最简单的解决方案
转自:http://blog.sina.com.cn/s/blog_4b168e640100lbma.html
VB之Collection---Collection集合类的更多相关文章
- Java API ——Collection集合类 & Iterator接口
对象数组举例: 学生类: package itcast01; /** * Created by gao on 15-12-9. */ public class Student { private St ...
- Java集合排序及java集合类详解--(Collection, List, Set, Map)
1 集合框架 1.1 集合框架概述 1.1.1 容器简介 到目前为止,我们已经学习了如何创建多个不同的对象,定义了这些对象以后,我们就可以利用它们来做一 ...
- 12. 集合类Collection和Map
*:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...
- Collection框架
Collection框架 集合框架(Collection Framework)泛指java.util包的若干个类和接口.如Collection,List,ArrayList,LinkedList,Ve ...
- java 深入技术二(Collection)
1. java集合 存储和管理多个java对象 包括很多java类和接口 Collection List Set ArrayList Lin ...
- collection集合框架
Java类集框架的优势: 1) 这种框架是高性能的.对基本类集(动态数组,链接表,树和散列表)的实现是高效率的.一般很少需要人工去对这些“数据引擎”编写代码. 2) 框架允许 ...
- Java集合框架之Collection接口
Java是一门面向对象的语言,那么我们写程序的时候最经常操作的便是对象了,为此,Java提供了一些专门用来处理对象的类库,这些类库的集合我们称之为集合框架.Java集合工具包位于Java.util包下 ...
- Collection和Collections的区别
Collection 是集合类的上级接口,继承它的接口主要有set和list.Collections 是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索,排序,线程安全化等操作.
- Thinking in Java——集合(Collection)
一.ArrayList的使用(略) 二.容器的基本概念 (一).Collection是集合类的基本接口 主要方法: public interface Collection<E>{ bool ...
- 集合Collection总览
前言 声明,本文使用的是JDK1.8 从今天开始正式去学习Java基础中最重要的东西--->集合 无论在开发中,在面试中这个知识点都是非常非常重要的,因此,我在此花费的时间也是很多,得参阅挺多的 ...
随机推荐
- mybaits<set>标签的使用
使用set标签可以将动态的配置SET 关键字,和剔除追加到条件末尾的任何不相关的逗号 1.在接口中创建方法 public void updateEmp(Employee employee); 2在映射 ...
- VS2010远程调试C#程序
场景: 客户的计算机运行程序出现异常,由于办公场所不在一起,无法直接在客户的机器上调试.此时希望可以直接在开发人员的计算机(本地机器)上远程调试客户机上的软件. 假设: 本地机器的系统账户为 GIS, ...
- 阶段3 1.Mybatis_08.动态SQL_03.mybatis中动态sql语句-foreach和sql标签
foreach标签 in的查询 sql语句好写,但是传参在映射文件里面改怎么传呢 定义一个List<Integer>成员变量,然后生成get和set 定义一个新的查询方法 open:开始符 ...
- 【ABAP系列】SAP ABAP 行列转换的方法
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP 行列转换的方法 ...
- IDEA激活—免费永久激活(lookdiv.com)
网址: http://lookdiv.com/ 钥匙就是网址 钥匙:lookdiv.com 亲测有效!非常好用.
- Python文档操作
1.打开和关闭文件 open('C:\Users\Second One\Desktop\a.txt')文件路径必须完整路径且为字符串格式 有三种方式: open('C:\\Users\\Second ...
- big data env setup
install Spark on CentOS: https://aodba.com/how-to-install-apache-spark-in-centos-standalone/ https:/ ...
- Chapter03 第三节 浮点数
3.3 浮点数 3.3.1 浮点数的表示 常规表示:12.34.0.01.8.0 E表示: 2.5e+8(2.5 10^8).7E6(7.0 10^6) (e大小写随意) (e+x或者E-x表示小数点 ...
- 应用安全 - 工具 | 数据库 - redis - 漏洞 - 汇总
未授权访问 Date 类型 未授权访问导致getshell 影响范围 复现 (1)shell反弹 (2)结合SSH服务 (3)结合web服务 分析
- JS刷新后回到页面顶部
window.location.href = location.href; 方法一: $(window).scrollTop(0); 方法二:$('html ,body').animate({ scr ...