Question bête - variable "non lié"

conan76 Messages postés 32 Date d'inscription lundi 28 juillet 2003 Statut Membre Dernière intervention 9 décembre 2013 - 26 août 2009 à 15:10
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 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.

Merci de votre aide.

6 réponses

nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
26 août 2009 à 16:52
Salut

Avec une classe ca serait mieux??

Public Class EtapeStructure
Private _id As Long
Private _Nom As String
Private _Avancement As Integer
End Structure
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
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
0
conan76 Messages postés 32 Date d'inscription lundi 28 juillet 2003 Statut Membre Derniè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.
0
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
conan76 Messages postés 32 Date d'inscription lundi 28 juillet 2003 Statut Membre Derniè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.

Merci.
0
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
27 août 2009 à 11:40
As tu regardes les dictionnaires?

http://msdn.microsoft.com/en-us/library/xfhwa508.aspx
0
Rejoignez-nous