在集合对象中获取项目的键

5
环境是,我推入集合的成员没有名字,不能被识别(为了避免糟糕的抽象,请不要惊慌:成员实际上是其他集合实例)。 为了能够进行快速搜索,我为每个新成员创建一个有意义的哈希名称,并将其作为“最顶层”集合的Add方法中的Key字符串提供。
当我有一个用于搜索的键时,一切都很好......问题是我想迭代集合的成员并获取在添加时提供的Key(生成的哈希码,不幸的是无法反向哈希)。
我正在定义插入的子集合实例的第一个成员是一个包含上述哈希值的字符串,但如果有人破解了这个过程,我会非常感激。

一些代码片段会很有帮助。 - boj
3个回答

6
简单的方法是使用字典而不是集合。字典本质上是一个键值对的关联数组,并支持将其键检索为数组。要使用字典,您需要添加对Microsoft Scripting Runtime的引用。使用字典的缺点是它不能像集合那样枚举。更复杂的解决方案是包装集合和字典以创建可枚举的字典,如下所述。
注意:为了使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

“crawls”在正确性方面(但它是波兰语)。我想我没有遇到过iii)如果您正在引用私有成员,我猜它会给用户机会来搞乱它(不知道VBA错误)。例如:set myKeys=thisWrapCol.Keys()Call myKeys.Delete()同意ii吗?(是的,这很奇怪) - jpinto3912
我猜现在我在第三行把你弄丢了,你是在重新编辑以避免传递priv成员吗? 无法使用Public Property Get NewEnum() As IUnknown Set NewEnum = someCol.[_NewEnum] End Property 我只使用vba... - jpinto3912
给我几分钟,我会编辑示例以澄清我现在的建议。 - cmsjr
请注意,由 Get 返回的字典的键集合是只读的。 - cmsjr
字典需要引用 Microsoft Scripting Runtime,这是个致命问题吗? - cmsjr
显示剩余17条评论

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

这对我有用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接