2009-04-10 47 views
5

環境是,我推入集合的成員是無名的,不可識別的(爲了避免不好的抽象,請不要嚇壞了:成員實際上是其他Collection實例)。 爲了能夠進行快速搜索,我爲每個新成員創建了一個有意義的散列名稱,並將其作爲密鑰字符串提供給「最頂級」集合的Add方法。獲取集合對象上的項目的關鍵

當我有一個關鍵,以一切都很花哨...... 問題是我想迭代集合的成員,並獲得提供添加(生成的哈希,不幸的是不是可能會反轉哈希)。

我正在繼續,通過定義插入的子集合實例的第一個成員是一個字符串,包含所提到的散列,但如果有人破解這個,我會非常感激。

+0

某些代碼片段會很有幫助。 – boj 2009-04-10 18:29:34

回答

6

簡單的方法是使用Dictionary而不是Collection。該字典本質上是一個關鍵字項對的關聯數組,並且支持將其鍵作爲數組進行檢索。要使用Dictionary,您需要添加對Microsoft腳本運行時的引用。使用字典的缺點是它不能像集合一樣枚舉。更復雜的解決方案將包裝集合和字典以創建一個枚舉字典,如下所述。

NB要使NewEnum在VBA中正常工作,必須按如下方式導出並手動編輯類模塊,然後重新導入。

Public Property Get NewEnum() As IUnknown 
Attribute NewEnum.VB_UserMemId = -4 
    Set NewEnum = someKeys.[_NewEnum] 
End Property 

例如

Option Explicit 
Private someKeys As Dictionary 
Private someCols As Collection 
Public Function Add(o As Object, Key As String) As Object 
    someKeys.Add Key, o 
    someCols.Add o, Key 
End Function 
Public Property Get Count() As Long 
    Count = someCols.Count 
End Property 
Public Property Get Item(vKey As Variant) As Object 
    Set Item = someCols.Item(vKey) 
End Property 
Public Sub Remove(vKey As Variant) 
    someKeys.Remove vKey 
    someCols.Remove vKey 
End Sub 
Public Property Get NewEnum() As IUnknown 
    Set NewEnum = someCols.[_NewEnum] 
End Property 
Public Property Get Keys() As Variant 
    Keys = someKeys.Keys 
End Property 
Private Sub Class_Initialize() 
    Set someKeys = New Dictionary 
    Set someCols = New Collection 
End Sub 
+0

它爬行。有Buts:i)Key在Add方法上不可選; ii)如何在刪除方法中刪除相應的密鑰? iii)對aC.Keys()可能是愚蠢的 - 刪除 我建議:ii)someKeys.Add(Key,Key)稍後允許someKeys.Remove(vKey); iii)以字符串形式獲取密鑰(anIndex長度) – jpinto3912 2009-04-10 20:08:05

2

你可以換你的成員集合在存儲密鑰和收集你自己收集的呼叫。這只是迭代的問題,拋出集合並詢問元素的鍵值(即散列)。

0

嘗試替代

Public Function NewEnum() As IUnknown 
     Set NewEnum = m_ObjectCollection.[_NewEnum] 
End Function 

Public Function NewEnum() As Collection 
     Set NewEnum = m_ObjectCollection 
End Function 

它爲我工作。

相關問題