Bonjour,

Je souhaiterais implémenter une classe de type collection itérable (donc a priori sans Scripting.Dictionary) avec méthodes (recherche, mise à jour,...) performantes. La classe contient des éléments non-ordonnés, mais uniques.

En fait, j'initialise ma classe clsFields avec plusieurs milliers d'instances clsField. Ceci ne pose pas de problèmes.

Le problème, c'est que je souhaite mettre à jour toutes le instances de clsFields et éventuellement en rajouter / supprimer. La mise à jour ne se fait pas forcément dans l'ordre d'initialisation de la classe clsFields.

J'ai déjà eu à implémenter une méthode de dichotomie dans un cas similaire lorsque la collection était ordonnée, mais ce n'est pas le cas dans mon exemple.

Mon idée est de rajouter une collection pIndexes qui contient toutes les clés de pFields que j'utiliserai dans les itérations pour la mise à jour de clsFields et, je supprimerai alors la clé à chaque mise à jour d'une instance.

Ci-dessous un exemple minimal de la classe clsFields :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
VERSION 1.0 CLASS
BEGIN
  MultiUse = -1  'True
END
Attribute VB_Name = "clsFields"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = False
Option Explicit
 
Private pFields As Collection
Private pIndexes As Collection
 
'classe itérable
Public Property Get NewEnum() As IUnknown
Attribute NewEnum.VB_UserMemId = -4
Attribute NewEnum.VB_MemberFlags = "40"
    Set NewEnum = pFields.[_NewEnum]
End Property
 
'-----------------------
 
'
Private Sub Class_Initialize()
    Set pFields = New Collection
    Set pIndexes = New Collection
End Sub
 
'
Private Sub Class_Terminate()
    Set pFields = Nothing
    Set pIndexes = Nothing
End Sub
 
'-----------------------
 
'méthode utilisée à l'initialisation uniquement
Public Sub add(ByRef field As clsField)
 
    pFields.add item:=field
 
    pIndexes.add item:=field.index, key:=field.key' field.index est numéral et field.key est une chaine caractère (unique)
 
End Sub
 
'
Public Sub update(ByRef field As clsField)
 
    'recherche de l'instance à partir des indices "restants" (ie pas encore utilisés pour la mise à jour)
    Dim index As Variant: For Each index In pIndexes
 
        If pFields(index:=index).key = field.key Then
 
            pFields(index:=index).update field:=field
 
            'les clés des instance mise à jour sont nettoyées au fur et à mesure
            pIndexes.Remove index:=field.key
 
            Exit Sub
 
        End If
 
    Next index
 
    pFields.add item:=field
 
    pIndexes.add item:=field.index, key:=field.key
 
End Sub
Cette possibilité me convient peut, car il ne me sera pas possible de même à jour plusieurs fois les mêmes instances. Pouvez-vous s'il vous plaît m'aviser sur les possibilités offertes par VBA ?

Merci par avance !