OVH Cloud OVH Cloud

collection en vb

10 réponses
Avatar
Pierre
Bonjour,

Dans une collection vb, je souhaiterais récupérer la clé des items. Exemple
:

dim col as Collection
col("k1")="a"
col("k2")="b"
....
for each k in col
'ici k vaut "a", "b", ......
'et je souhaiterais récupérer "k1", "k2", ....
next

Le for each donne l'élément lui-même et non pas sa clé (en vbscript on
récupère la clé).

Comment faire pour avoir la clé à partir de l'élément ?

Merci.
Cordialement.

Pierre.

10 réponses

Avatar
Gloops
Salut,

Je n'ai pas connaissance que ça soit prévu, donc à moins de créer une
deuxième collection qui inverse les rôles entre clef et valeur (et faire
attention de bien synchroniser les modifications), tu ne couperas pas à
une boucle du style :

Function Renverse(Refer As String) As String
For Each Item in col
If Item.value = refer Then
Renverse = Item.Key
Exit Function
End If
Next
End Function

A moins que quelqu'un sache créer un index sur une collection ?
_____________________________________
Pierre a écrit, le 24/10/2005 09:32 :

Bonjour,

Dans une collection vb, je souhaiterais récupérer la clé des items. Exemple
:

dim col as Collection
col("k1")="a"
col("k2")="b"
....
for each k in col
'ici k vaut "a", "b", ......
'et je souhaiterais récupérer "k1", "k2", ....
next

Le for each donne l'élément lui-même et non pas sa clé (en vbscript on
récupère la clé).

Comment faire pour avoir la clé à partir de l'élément ?

Merci.
Cordialement.

Pierre.




Avatar
Patrice Henrio
Je vais peut-être dire une bêtise mais pourquoi ne pas faire cela

Dim TKey() as string, Tvalue() as string, V as object, Index as long

Index=1
Redim TKey(1 to Col.count)
Redim Tvalue(1 to Col.Count)
For each V in Col
Tkey(Index)=V.key
TValue(Index)=V.value
Next


"Gloops" a écrit dans le message de news:
435cca37$0$27421$
Salut,

Je n'ai pas connaissance que ça soit prévu, donc à moins de créer une
deuxième collection qui inverse les rôles entre clef et valeur (et faire
attention de bien synchroniser les modifications), tu ne couperas pas à
une boucle du style :

Function Renverse(Refer As String) As String
For Each Item in col
If Item.value = refer Then
Renverse = Item.Key
Exit Function
End If
Next
End Function

A moins que quelqu'un sache créer un index sur une collection ?
_____________________________________
Pierre a écrit, le 24/10/2005 09:32 :

Bonjour,

Dans une collection vb, je souhaiterais récupérer la clé des items.
Exemple :

dim col as Collection
col("k1")="a"
col("k2")="b"
....
for each k in col
'ici k vaut "a", "b", ......
'et je souhaiterais récupérer "k1", "k2", ....
next

Le for each donne l'élément lui-même et non pas sa clé (en vbscript on
récupère la clé).

Comment faire pour avoir la clé à partir de l'élément ?

Merci.
Cordialement.

Pierre.





Avatar
Gloops
Patrice Henrio a écrit, le 24/10/2005 15:22 :
Index=1
Redim TKey(1 to Col.count)
Redim Tvalue(1 to Col.Count)
For each V in Col
Tkey(Index)=V.key
TValue(Index)=V.value
Next



Oh, j'étais parti sur une deuxième collection ...
Tu veux dire deux tableaux, simplement ?

D'ailleurs, je sèche sur comment faire une recherche dans un tableau (à
part le parcourir dans une boucle, bien entendu, mais alors autant en
revenir à ma première réponse). Ce que j'ai trouvé dans MSDN concernait
FoxPro, mais c'est vrai que je n'ai pas intégralement épluché les 500
réponses.
Avatar
Patrice Henrio
Oui effectivement car c'est vrai que le problème de départ c'est retrouvé
la clé connaissant la valeur donc une collection dans l'autre sens value/key
au lieu de key/value. Un problème existera si plusieurs clés ont la même
valeur ...


"Gloops" a écrit dans le message de news:
435ce86b$0$27430$
Patrice Henrio a écrit, le 24/10/2005 15:22 :
Index=1
Redim TKey(1 to Col.count)
Redim Tvalue(1 to Col.Count)
For each V in Col
Tkey(Index)=V.key
TValue(Index)=V.value
Next



Oh, j'étais parti sur une deuxième collection ...
Tu veux dire deux tableaux, simplement ?

D'ailleurs, je sèche sur comment faire une recherche dans un tableau (à
part le parcourir dans une boucle, bien entendu, mais alors autant en
revenir à ma première réponse). Ce que j'ai trouvé dans MSDN concernait
FoxPro, mais c'est vrai que je n'ai pas intégralement épluché les 500
réponses.



Avatar
Gloops
Effectivement. Là il reste la solution d'un tableau avec une dimension
de plus, qu'on va parcourir avec une boucle. C'est plus lourd à mettre
en oeuvre qu'une requête SQL dans une base, mais probablement plus
rapide, sauf si la base passe par un cache efficace.

Si on fait un tableau avec plusieurs dimensions, je suppose que la
dimension d'indice doit être dimensionnée au plus grand nombre de
valeurs par clef, plus une qui indique le nombre de valeurs renseignées.
A moins de parcourir toutes les valeurs et de ne retenir celles qui ne
sont pas Null, reste à voir ce qui est le plus rapide.
_____________________________________________
Patrice Henrio a écrit, le 24/10/2005 23:02 :

Oui effectivement car c'est vrai que le problème de départ c'est retrouvé
la clé connaissant la valeur donc une collection dans l'autre sens value/key
au lieu de key/value. Un problème existera si plusieurs clés ont la même
valeur ...


"Gloops" a écrit dans le message de news:
435ce86b$0$27430$

Oh, j'étais parti sur une deuxième collection ...
Tu veux dire deux tableaux, simplement ?

D'ailleurs, je sèche sur comment faire une recherche dans un tableau (à
part le parcourir dans une boucle, bien entendu, mais alors autant en
revenir à ma première réponse). Ce que j'ai trouvé dans MSDN concernait
FoxPro, mais c'est vrai que je n'ai pas intégralement épluché les 500
réponses.








Avatar
Jean-Marc
Hello,

si la mémoire n'est pas un problème, alors il est simple
de gérer ça avec 2 hash tables pour les paires "clefs/valeurs"
et un tableau de valeurs (+ un second pour la gestion des collisions).
Ca demanderait 30 minutes de réflexion, ensuite le codage devrait
être assez aisé.

Points faibles
--------------
- Duplication (partielle) des données
- Nécessité de synchroniser les 2 tables en cas d'ajout, suppression, etc.
- Place en mémoire

Points forts
------------
- Performances imbattables (plus rapide, tu meurs :-) )
- Extensible pour faire plein de choses amusantes
- Très réutilisable

Hop, au boulot !

--
Jean-marc
Tester mon serveur (VB6) => http://myjmnhome.dyndns.org
"There are only 10 kind of people
those who understand binary and those who don't."
mailto: remove '_no_spam_' ;



"Gloops" a écrit dans le message de
news:435ecf87$0$5405$
Effectivement. Là il reste la solution d'un tableau avec une dimension
de plus, qu'on va parcourir avec une boucle. C'est plus lourd à mettre
en oeuvre qu'une requête SQL dans une base, mais probablement plus
rapide, sauf si la base passe par un cache efficace.

Si on fait un tableau avec plusieurs dimensions, je suppose que la
dimension d'indice doit être dimensionnée au plus grand nombre de
valeurs par clef, plus une qui indique le nombre de valeurs renseignées.
A moins de parcourir toutes les valeurs et de ne retenir celles qui ne
sont pas Null, reste à voir ce qui est le plus rapide.
_____________________________________________
Patrice Henrio a écrit, le 24/10/2005 23:02 :

> Oui effectivement car c'est vrai que le problème de départ c'est


retrouvé
> la clé connaissant la valeur donc une collection dans l'autre sens


value/key
> au lieu de key/value. Un problème existera si plusieurs clés ont la même
> valeur ...
>
>
> "Gloops" a écrit dans le message de news:
> 435ce86b$0$27430$
>
>>Oh, j'étais parti sur une deuxième collection ...
>>Tu veux dire deux tableaux, simplement ?
>>
>>D'ailleurs, je sèche sur comment faire une recherche dans un tableau (à
>>part le parcourir dans une boucle, bien entendu, mais alors autant en
>>revenir à ma première réponse). Ce que j'ai trouvé dans MSDN concernait
>>FoxPro, mais c'est vrai que je n'ai pas intégralement épluché les 500
>>réponses.
>>
>
>
>



Avatar
Pierre
Hello

En fait, j'ai trouvé deux solutions :

1°) en restant dans les collections vba :
faire une collection de collection
chaque sous collection contenant l'élément et la clé
ainsi :

for each E in COL
'E est la sous collection
key = E("KEY")
element = E("ELEMENT")
next

2°) En utilisant comme en vbscript l'objet scripting.dictionnary qui est
très pratique
puisque le for each renvoie la clé et non l'élément
for each K in DIC
key = K
element = DIC(K)
next

J'ai mis en oeuvre la première solution pour rester dans le vba de base car
le scripting dictionnary nécessite wsh.

Pierre.


ajouter un élément "key"
"Pierre" a écrit dans le message de news:

Bonjour,

Dans une collection vb, je souhaiterais récupérer la clé des items.
Exemple :

dim col as Collection
col("k1")="a"
col("k2")="b"
....
for each k in col
'ici k vaut "a", "b", ......
'et je souhaiterais récupérer "k1", "k2", ....
next

Le for each donne l'élément lui-même et non pas sa clé (en vbscript on
récupère la clé).

Comment faire pour avoir la clé à partir de l'élément ?

Merci.
Cordialement.

Pierre.



Avatar
Gloops
Pierre a écrit, le 27/10/2005 08:48 :
for each E in COL
'E est la sous collection
key = E("KEY")
element = E("ELEMENT")
next



Bonjour,

J'avoue que je n'ai pas bien compris.
Avatar
Pierre
En fait, COL est un collection de collections, ie les éléments de COL sont
des collections.
Et dans ces collections, on met deux éléments : le premier élément est la
clé indexé sur "KEY" et le deuxième est le contenu indexé sur "ELEMENT".
COL(E)("KEY")= la clé (qui en fait est un élément comme un autre)
COL(E)("ELEMENT")=l'élément

Quand on crée COL, au lieu de faire simplement :

COL.add "mon texte","ma clé"

on fait :

set E = new Collection
E.add "mon texte","ELEMENT"
E.add "ma clé","KEY"
COL.add E

voilà.




"Gloops" a écrit dans le message de news:
43607c9f$0$17243$
Pierre a écrit, le 27/10/2005 08:48 :
for each E in COL
'E est la sous collection
key = E("KEY")
element = E("ELEMENT")
next



Bonjour,

J'avoue que je n'ai pas bien compris.




Avatar
Gloops
Oui, en fait ça j'avais compris, merci, mais pour la recherche, on fait
comment ? J'imagine que le but de la manoeuvre est de faciliter la
recherche ? Enfin si j'ai bien compris le sujet du fil ...
_____________________________________
Pierre a écrit, le 27/10/2005 10:37 :
En fait, COL est un collection de collections, ie les éléments de COL sont
des collections.
Et dans ces collections, on met deux éléments : le premier élément est la
clé indexé sur "KEY" et le deuxième est le contenu indexé sur "ELEMENT".
COL(E)("KEY")= la clé (qui en fait est un élément comme un autre)
COL(E)("ELEMENT")=l'élément

Quand on crée COL, au lieu de faire simplement :

COL.add "mon texte","ma clé"

on fait :

set E = new Collection
E.add "mon texte","ELEMENT"
E.add "ma clé","KEY"
COL.add E

voilà.




"Gloops" a écrit dans le message de news:
43607c9f$0$17243$

Pierre a écrit, le 27/10/2005 08:48 :

for each E in COL
'E est la sous collection
key = E("KEY")
element = E("ELEMENT")
next



Bonjour,

J'avoue que je n'ai pas bien compris.