2009-04-10 23 views
5

El ambiente es que los miembros que estoy introduciendo en la Colección no tienen nombre, no son identificables (para evitar malas abstracciones, y por favor, no se asuste: los miembros son en realidad otras instancias de Colección). Para poder realizar búsquedas rápidas, estoy creando un nombre hash significativo para cada nuevo miembro y lo proporciono como la cadena clave, en el método Agregar de la colección "más alta".Obtener la clave de un elemento en un objeto Collection

Cuando tengo una clave para seach con, Dandy ... problema de todo es me gustaría repetir los miembros de la colección y obtener la clave que se proporciona en Añadir (el hash generado, que no es Unfortunetely posible revertir-Hash).

Avanzo definiendo que el primer miembro de la instancia de subcolección insertada es una cadena que contiene el hash mencionado, pero si alguien lo rompe, me sentiré muy agradecido.

+0

Algún fragmento de código sería útil. – boj

Respuesta

6

El enfoque simple sería utilizar un Dictionary en lugar de una colección. El diccionario es esencialmente una matriz asociativa de clave, pares de elementos y recuperación de soporte de sus claves como una matriz. Para usar el Diccionario, deberá agregar una referencia al Microsoft Scripting Runtime. El inconveniente de usar el diccionario es que no es enumerable de la misma manera que la colección. Una solución más elaborada sería envolver la colección y el diccionario para crear un diccionario enumerable como se describe a continuación.

NB Para hacer que NewEnum funcione correctamente en VBA, el módulo de clase tiene que ser exportado y editado manualmente de la siguiente manera y luego reimportado.

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

ejemplo

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

Arrastra. Hay errores: i) La clave no puede ser opcional en el método Agregar; ii) ¿cómo se elimina la clave correspondiente durante el método de eliminación ?; iii) es tonto-posible para aC.Keys(). Eliminar Sugiero: ii) someKeys.Add (clave, clave) permitiendo someKeys.Remove (vKey) más adelante; iii) Obtener claves (un índice tan largo) como la cadena – jpinto3912

+0

i. buen punto. ii. No le presté ninguna consideración, y su sugerencia es la mejor de las dos alternativas que se ofrecen, pero Key, Key me molesta. Tal vez el diccionario sería mejor para las llaves. iii. Ese Get sería redundante ya que el miembro predeterminado de la colección devuelta sería .Item – cmsjr

+0

Además, ¿rastrea en el sentido de rendimiento, o en el sentido de no está completo? – cmsjr

2

Se puede envolver sus colecciones miembros en que la llamada propia colección que guarda la clave y la colección. Es solo cuestión de iterar arrojar la colección y preguntar a los elementos por su clave (es decir, hash).

0

tratan de sustituir

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

con

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

que trabajó para mí.

Cuestiones relacionadas