环境是我正在推进收集的成员是无名的,无法识别的(为了避免错误的抽象,请不要惊慌失措:成员实际上是其他收集实例)。 为了能够进行快速搜索,我正在为每个新成员创建一个有意义的哈希名称,并在“最顶层”集合的Add方法上将其作为Key字符串提供。
当我有一把关键的时候,一切都花花公子...... 问题是我想迭代集合的成员并获得Add上提供的Key(生成的Hash,不幸的是,不可能反向Hash)。
我正在继续定义插入的子集合实例的第一个成员是一个包含所提到的哈希的字符串,但如果有人破解了这一点,我将非常感激。
答案 0 :(得分:6)
简单的方法是使用Dictionary而不是集合。 Dictionary本质上是键,项对的关联数组,支持将其键作为数组检索。要使用Dictionary,您需要添加对Microsoft Scripting Runtime的引用。使用字典的缺点是它不能以与集合相同的方式枚举。一个更精细的解决方案是包装集合和字典以创建一个可枚举的字典,如下所述。
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
答案 1 :(得分:2)
您可以将您的成员集合包装在您自己的存储密钥和集合的集合调用中。这只是迭代抛出集合并询问元素的键(即你的哈希)。
答案 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
它对我有用。