VB之Collection---Collection集合類


由於要對一些數據進行處理,比較麻煩,實現某個算法要處理大量不同的不同類型的數據。

所以考慮到一些因素,又在使用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:=2

可以使用 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 = 3

可行的原因是 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM