conan76
Messages postés32Date d'inscriptionlundi 28 juillet 2003StatutMembreDernière intervention 9 décembre 2013
-
26 août 2009 à 15:10
nhervagault
Messages postés6063Date d'inscriptiondimanche 13 avril 2003StatutMembreDernière intervention15 juillet 2011
-
27 août 2009 à 11:40
Bonjour,
J'ai une question bête.
J'ai dans une classe, la définition d'une structure :
Public Structure EtapeStructure
Private _id As Long
Private _Nom As String
Private _Avancement As Integer
End Structure
avec leurs propriétés
dans ma classe, j'ai une variable de type arraylist qui va contenir des objets de type de ma structure.
j'ai quelques méthodes pour ajouter, récupérer le contenu des objets contenu dans mon arraylist.
et je bute sur le problème suivant :
Je me fais une méthode qui va parcourir mon arraylist jusqu'a trouver l'objet en question et le mettre à jour. Sauf que la mise à jour n'est pas répercuter sur l'objet, mais simplement sur sa copie lors de ma boucle.
Public Sub updAvancementEtape(ByVal id As Long, ByVal value As Integer)
For Each element As EtapeStructure In _EtapesAvt
If element.id = id Then
element.Avancement = value
Exit Sub
End If
Next
End Sub
là c'est bien element.Avancement qui a la nouvelle valeur mais pas l'objet contenu dans _EtapeAvt (mon arraylist)
Comment faire ?
je suis sûr que c'est tout bête, car par exemple en php je passerai par référence. or dans vb, je n'ai vu des référence que par byVal et byRef.
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 26 août 2009 à 22:06
Les exemples de codes que tu donne sont-ils réellement ce que tu utilise ????
element.id doit te générer une erreur, id n'est pas un membre de EtapeStructure
element._id ne peut pas plus marcher, _id étant de type Private, il n'est pas accessible depuis l'extérieur.
Les 2 bouts de codes que tu donne ne sont pas cohérents entre eux !
Comme le dit nhervagault, il faut utiliser une classe plutot qu'une structure.
Les structures sont des types valeur tandis que les classes sont des types références. C'est à dire, qu'une variable de type structure stocke directe les valeurs des données, tandis qu'avec une classe, chaque membre est une référence vers la données en mémoire.
Dans une boucle For Each, élément est une copie en lecture seule de l'élément correspondant dans la collection. Il ne peut donc pas être directement modifié. Cependant si l'élément en question est de type référence, si l'élément lui-même n'est pas modifiable, les données référencées par les membres sont modifiables.
C'est pour cela, qu'à code identique, les membres d'une structures ne sont pas modifiables, ceux d'une classe le sont
[i][b]---- Sevyc64 (alias Casy) ----
[hr]# LE PARTAGE EST NOTRE FORCE #/b/i
conan76
Messages postés32Date d'inscriptionlundi 28 juillet 2003StatutMembreDernière intervention 9 décembre 2013 27 août 2009 à 09:25
Merci pour la solution, j'ai simplemnt changé "structure" en "class" et ca marche. Je ne savais pas qu'une copie était faite lors de l'accès au données issu d'une structure.
J'avais utilisé une structure parce que je me disais que pour 3 variables, pas besoin de partir dans une classe : Loupé
Oui, c'est le code que j'avais, simplement element.id marchait car comme je l'ai dis j'avais mes propriétés.
Sinon, je profite de l'occasion pour une dernière question, pour ma méthode updAvancementEtape, je suis obligé de passé par une boucle pour parcourir les éléments de mon arraylist et tester chaque "id" de l'objet 1 à 1 avant de le trouvé, ou il y a mieux et plus rapide ?
Encore merci.
Nota : je m'apprettais à faire "Réponse accepté" mais je vais attendre, car je ne sais pas si ca bloque la possiblité de répondre à ma dernière question, je vais donc attendre un peu.
nhervagault
Messages postés6063Date d'inscriptiondimanche 13 avril 2003StatutMembreDernière intervention15 juillet 201137 27 août 2009 à 09:33
Salut,
Utilises un Hashtable ou un Dictionnaire (hashtable générique)
à la place de l'ArrayList.
Depuis dotnet 2.0, il est préférable d'utiliser les type générique
list (of T)
Pour gagner en perf et en visibilité il y a pas besoin des opérations de casting ou de boxing unboxing sur les entiers par exemple.
Car l'access est quasi direct par un hashage de la clé.
Bon dev
Vous n’avez pas trouvé la réponse que vous recherchez ?
conan76
Messages postés32Date d'inscriptionlundi 28 juillet 2003StatutMembreDernière intervention 9 décembre 2013 27 août 2009 à 11:34
Pour l'arraylist, je l'avais utilisé par facilité dans un premier temps, j'ai pris l'habitude de travailler avec les list(of T) depuis VS2005 (pour rapidité et consomation mémoire, dans le traitement de beaucoup de données).
Simplement ce que je voudrais savoir, c'est s'il n'y a pas d'autre moyen pour parcourir et trouver rapidement mon élément de passé par le parcours global (for,foreach). Par exemple si mon élément est l'avant dernier d'une énorme liste, le fait de parcourir quand même l'ensemble -1 du list(of T) pour trouver mon élément, n'est pas le plus adapté je pense. Je sais que maintenant je pourrais utiliser Linq, mais sans ce dernier, comment faire.