L'environnement est que les membres que je pousse dans la collection sont sans nom, non identifiables (pour éviter les mauvaises abstractions, et s'il vous plaît, ne paniquez pas: les membres sont en fait autres instances de collection). Afin de pouvoir effectuer des recherches rapides, je crée un nom de hachage significatif pour chaque nouveau membre, et je le fournis comme clé, sur la méthode Add de la collection "topmost". Quand j'ai une clé avec laquelle chercher, tout est dandy ... Le problème est que je voudrais parcourir les membres de la collection et obtenir la clé qui a été fournie sur Ajouter (le Hash généré, ce n'est malheureusement pas possible d'inverser-Hash). Je passe à autre chose en définissant que le premier membre de l'instance de sous-collection insérée est une chaîne contenant le hachage mentionné, mais si quelqu'un le craque, je serai très obligé.Obtenir la clé d'un objet sur un objet Collection
Répondre
L'approche simple serait d'utiliser un Dictionary au lieu d'une collection. Le dictionnaire est essentiellement un tableau associatif de clés, de paires d'éléments et de prise en charge de la récupération de ses clés sous forme de tableau. Pour utiliser le dictionnaire, vous devrez ajouter une référence à Microsoft Scripting Runtime. L'inconvénient de l'utilisation du dictionnaire est qu'il n'est pas énumérable de la même manière que la collection. Une solution plus élaborée serait d'envelopper la collection et le dictionnaire pour créer un dictionnaire énumérable comme indiqué ci-dessous.
NB Pour que NewEnum fonctionne correctement dans VBA, le module de classe doit être exporté et modifié manuellement comme suit, puis réimporté.
Public Property Get NewEnum() As IUnknown
Attribute NewEnum.VB_UserMemId = -4
Set NewEnum = someKeys.[_NewEnum]
End Property
exemple
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
Il rampe. Il y a Buts: i) La clé ne peut pas être optionnelle sur la méthode Add; ii) comment supprimez-vous la clé correspondante lors de la suppression? iii) c'est idiot à aC.Keys(). Delete Je suggère: ii) someKeys.Add (Key, Key) permettant someKeys.Remove (vKey) plus tard; iii) Obtenir les clés (anIndex aussi long) que la chaîne – jpinto3912
i. bon point. ii. Je n'y ai pas prêté attention, et votre suggestion est la meilleure des deux alternatives offertes, mais Key, Key m'irrite. Peut-être que le dictionnaire serait mieux pour les clés. iii. Ce Get serait redondant puisque le membre par défaut de la collection retournée serait .Item – cmsjr
Aussi, rampe dans le sens de la performance, ou dans le sens de n'est pas complète? – cmsjr
Vous pouvez envelopper vos collections de membres dans votre propre appel de collecte qui stockent la clé et la collection. Il ne s'agit que d'itéter jeter la collection et de demander aux éléments leur clé (c'est-à-dire vous).
essayer de remplacer
Public Function NewEnum() As IUnknown
Set NewEnum = m_ObjectCollection.[_NewEnum]
End Function
avec
Public Function NewEnum() As Collection
Set NewEnum = m_ObjectCollection
End Function
il a travaillé pour moi.
Un extrait de code serait utile. – boj