IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

[vb.net] Collection : référence sur un élément d'une collection


Sujet :

VB.NET

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 483
    Points : 309
    Points
    309
    Par défaut [vb.net] Collection : référence sur un élément d'une collection
    Bonjour,

    Je commence à me débrouiller avec les collections.

    Cependant j'avais une petite question sur la possibilité dans une collection de pointer ( faire référence ) à un élément d'une autre collection.

    En fait dans mon application j'ai une première phase ou je récupère les informations de la base de donnée que je stocke dans une collection de class Employé.

    Ensuite dans mon application je dois faire des calcules et de nouveau réutiliser la liste des employés, sans avoir la nécessité d'effectuer des modifications, juste de pouvoir consulter les informations y faire référence.

    Je voulais d'une part savoir si il était possible de le faire avec les collections de classe?

    Et si oui comment, je viens de regarder dans l'excellentissime cours de Plasserre mais j'ai pas encore du assez regarder.

    Je retourne à mes recherches

    ++

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    une collection contient des liens vers des instances
    il est tout à fait possible qu'une instance se trouve dans plusieurs collections
    quand on modifie une instance qui se trouve dans plusieurs collections, on voit les modifs depuis toutes les collections, vu que ce n'est que des pointeurs

    si listeemployes est un list(of employe)
    et listeEmployesServiceDeveloppement un list(of employe)

    pour le remplir tu peux faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for each e as employe in listeemployes
      if e.service = "Service développement" then listeEmployesServiceDeveloppement.Add(e)
    next
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 483
    Points : 309
    Points
    309
    Par défaut
    bonjour,

    Et merci pour ta réponse.

    J'ai donc justement une classe "DataEmploy.vb" (serais tu devin avec ton exemple ? ) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Public Class DataEmploy
        Public Id_Employee As Integer
        Public Ressource As String
        Public contracted_Time As Double
        Public Maitrise As String
        Public Secteur As String
        Public Contrat As String
        Public Matricule As String
        'collection de journée de l'employé
        Public collCalEmploy As New System.Collections.Generic.List(Of CalEmploy)
        'collection de journée d'absence de l'employé
        Public collCalAbsEmploy As New System.Collections.Generic.List(Of CalAbsJourEmploy)
    End Class
    J'ai crée deux objet de ce type

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    'collection de la liste des employés de la chaine de production
    Public collInfoEmploy As New System.Collections.Generic.List(Of DataEmploy)
     
    'test de copie de référence d'un employé
    Public collInfoEmployTest As New System.Collections.Generic.List(Of DataEmploy)
    et j'ai fait ce test

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    'test d'ajout par copie de référence d'un employé
    'il fait une copie complète la modification dans collInfoEmployTest ne 'modifiant pas collInfoEmploy
     collInfoEmployTest.Add(collInfoEmploy(0))
     collInfoEmployTest(0).Ressource = "Test"
    collInfoEmployTest(0).ressource est bien = " Test" mais pas collInfoEmploy(0).ressource.

    Par contre il récupère bien toutes les infos.

    Le soucis c qu'il y a pas mal d'infos et que j'aimerai éviter de les duppliquer en mémoire.

    Je sais pas si ma méthode de test est bonne mais si il s'agissait bien d'une référence collInfoEmploy(0).ressource aurait du lui aussi être modifié, je me trompe?

    encore merci pour ta réponse

    ++

  4. #4
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    Citation Envoyé par narutobaka Voir le message
    collInfoEmployTest(0).ressource est bien = " Test" mais pas collInfoEmploy(0).ressource.

    Par contre il récupère bien toutes les infos.

    Le soucis c qu'il y a pas mal d'infos et que j'aimerai éviter de les duppliquer en mémoire.
    les classes sont des types par référence donc qu'un employé soit dans 10 collections ne fait pas grimper la ram par 10 (compter 32 ou 64bits selon l'os pour un pointeur)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    collInfoEmployTest.Add(collInfoEmploy(0))
     collInfoEmployTest(0).Ressource = "Test"
    collInfoEmploy(0) est un DataEmploy
    collInfoEmployTest.Add l'ajoute dans collInfoEmployTest
    collInfoEmployTest(0) retourne le DataEmploy au niveau 0 dans la collection, mais il équivaut à collInfoEmploy(0) seulement si la collection était vide avant, car si au moment de faire le add il se retrouve en 3eme position, c'est normal que dans ce en modifiant .ressource sur l'un ca ne répercute pas sur l'autre
    (en fait ce n'est pas une répercussion sur l'autre mais juste que les 2 pointes vers la meme adresse mémoire, donc en modifiant pour un et en lisant de l'autre on voit la modif)


    et je ne suis pas devin, tu parles d'employés dans ta question et ca fait plusieurs jours que je te réponds ^^

    y a un cours ici : http://plasserre.developpez.com/cours/vb-net/
    ca doit expliqué les notions de références et valeurs (comme byval et byref si tu connais pas la différences ca peut t'aider à comprendre tous ces concepts)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 483
    Points : 309
    Points
    309
    Par défaut
    Bonjour

    collInfoEmployTest(0) retourne le DataEmploy au niveau 0 dans la collection, mais il équivaut à collInfoEmploy(0) seulement si la collection était vide avant, car si au moment de faire le add il se retrouve en 3eme position, c'est normal que dans ce en modifiant .ressource sur l'un ca ne répercute pas sur l'autre
    J'ai bien fait mon test dans le cas ou collInfoEmployTest était vide, et je n'ai fait le test qu'avec une valeur.

    (en fait ce n'est pas une répercussion sur l'autre mais juste que les 2 pointes vers la meme adresse mémoire, donc en modifiant pour un et en lisant de l'autre on voit la modif)
    Cependant je n'ai pas l'impression qu'il pointe sur la même adresse mémoire. Car lorsque je fait la modification sur collInfoEmployTest(0) et que je regarde via l'espion la valeur dans collInfoEmploy(0) cette dernière elle ne semble pas modifier.

    Il semble qu'il s'agisse d'une copie non d'une référence. Où ai-je fait une boulette ?

    Je vais aller relire le cours de plasserre

    et je ne suis pas devin, tu parles d'employés dans ta question et ca fait plusieurs jours que je te réponds ^^
    Et je te remercie encore pour ton aide.

    ++

Discussions similaires

  1. [JAXB] Annotation permettant d'avoir une référence sur un élément
    Par kase74 dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 28/10/2010, 18h15
  2. Référence sur un élèment d'un itérateur
    Par analgesic_86 dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 17/03/2010, 18h33
  3. Réponses: 4
    Dernier message: 25/11/2009, 10h46
  4. Réponses: 5
    Dernier message: 30/01/2008, 09h18
  5. Réponses: 7
    Dernier message: 10/05/2006, 11h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo