获取 Collection 对象上项目的键
Posted
技术标签:
【中文标题】获取 Collection 对象上项目的键【英文标题】:Get the key of an item on a Collection object 【发布时间】:2009-04-10 18:16:05 【问题描述】:环境是我推入 Collection 的成员是无名的,无法识别的(为了避免糟糕的抽象,请不要惊慌:成员实际上是其他 Collection 实例)。 为了能够进行快速搜索,我正在为每个新成员创建一个有意义的哈希名称,并将其作为 Key 字符串提供给“最顶层”集合的 Add 方法。
当我有一把钥匙可以用来搜索时,一切都变得花花公子...... 问题是我想迭代集合的成员并获取添加时提供的密钥(生成的哈希,不幸的是无法反向哈希)。
我将继续定义插入的子集合实例的第一个成员是一个字符串,其中包含提到的哈希,但如果有人破解了这个,我将非常感激。
【问题讨论】:
一些代码 sn-p 会有所帮助。 【参考方案1】:简单的方法是使用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
【讨论】:
它会爬行。有Buts:i)Add方法上的Key不能是可选的; ii) 如何在 remove 方法中删除相应的密钥? iii)对 aC.Keys().Delete 来说是愚蠢的,我建议:ii) someKeys.Add(Key, Key) 稍后允许 someKeys.Remove(vKey) ; iii) 获取 Keys(anIndex as long) as String 我。好点子。 ii.我没有考虑到这一点,您的建议是提供的两种选择中更好的选择,但是 Key,Key 让我感到厌烦。也许字典会更好的键。 iii.该 Get 将是多余的,因为返回的集合的默认成员将是 .Item 还有,爬虫是从表现意义上说,还是从不完整意义上说? “爬行”的正确性(但它在波兰语中)。我想我在 iii) 上没有遇到过如果你给 priv 提供 ref。成员,我想它给了用户机会。弄乱它(不知道vba是否错误)。例如。 set myKeys=thisWrapCol.Keys() 调用 myKeys.Delete() 同意 ii? (是的,这很奇怪) 好的,我在 iii 和你在一起。对于 ii 我仍然想知道将 someKeys 设为 Dictionary 是否没有意义,在 Add 期间添加键和集合并通过属性公开其 Keys 集合,这将为您提供一种获取键集或单个键的方法没有封装问题。【参考方案2】:您可以将您的成员集合包装在您自己的集合调用中,该集合调用存储密钥和集合。这只是迭代抛出集合并询问元素的键(即你散列)的问题。
【讨论】:
【参考方案3】:尝试替换
Public Function NewEnum() As IUnknown
Set NewEnum = m_ObjectCollection.[_NewEnum]
End Function
与
Public Function NewEnum() As Collection
Set NewEnum = m_ObjectCollection
End Function
它对我有用。
【讨论】:
以上是关于获取 Collection 对象上项目的键的主要内容,如果未能解决你的问题,请参考以下文章
html 放置在collection.liquid底部的JavaScript标记,用于处理.sort-by select和.coll-filter选择。