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 :

Clonage d'une " list (of "


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Juillet 2010
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 70
    Par défaut Clonage d'une " list (of "
    Bonjour,

    je souhaite extraire des données d'un fichier csv,
    j'utilise pour cela une boucle et une fonction de clonage.

    voici mon probleme:
    la liste de "couple" de chacun des element chargé est la même. j'ai l'impression qu'il fonctionne byref et non byval.

    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
     Private Function determinerattendu(ByVal liste As ArrayList) As List(Of element)
     
     
            Dim decalage As Integer
     
            Dim attendu As New List(Of element)
            Dim element1 As New element
            Dim listc1 As New List(Of couple)
            Dim couple1 As New couple
            Dim valeurs As New ArrayList
            Dim nbrcouple As Integer
     
     
            valeurs = separerligneencase(liste(0))
            decalage = Val(valeurs.Item(2))
     
     
            For i = 4 To 3 + decalage
                valeurs = separerligneencase(liste.Item(i))
                nbrcouple = valeurs(3)
                element1.type = valeurs(2)
                listc1.Clear()
     
                For k = 1 To nbrcouple
                    couple1.debut = valeurs(2 + 2 * k)
                    couple1.fin = valeurs(3 + 2 * k)
                    listc1.Add(couple1.Clone)
                Next k
                '????????
                'Probleme dans la liste de couples
     
                element1.indices = listc1
                attendu.Add(element1.Clone)
                listc1.Clear()
     
            Next
            Return attendu
     
        End Function
    et la classe associée où apparait la fonction de clonage:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Public Class element
        Property type As String
        Property indices As List(Of couple)
        Public Function Clone() As element
            Dim ObjetClone As New element
            ObjetClone.type = type
            If indices IsNot Nothing Then
                ObjetClone.indices = indices
            End If
            Return ObjetClone
        End Function
    End Class
    qqn pourrait il m'aider?

    merci par avance
    Olivier

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Ben c'est normal, tu affectes la même liste listc1 à chacun des éléments, en la vidant à chaque fois... List(Of T) est un type référence, pas un type valeur, et quand tu affectes la liste à la propriété indices d'un élément, tu affectes juste une référence vers la même liste. Ca n'a rien à voir avec le clonage, il faut créer une nouvelle instance de List(Of T) à chaque itération de la boucle.

    D'une manière générale, évite d'avoir des objets que tu réutilises en les modifiant à chaque itération de la boucle. Crée plutôt une nouvelle instance à chaque itération, et déclare les variables au niveau où tu en as besoin et pas plus haut dans le scope. Ca évitera d'avoir à cloner tes objets, et le code sera plus clair

    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
     Private Function determinerattendu(ByVal liste As ArrayList) As List(Of element)
     
     
            Dim decalage As Integer
     
            Dim attendu As New List(Of element)
            Dim valeurs As New ArrayList 
     
            valeurs = separerligneencase(liste(0))
            decalage = Val(valeurs.Item(2))
     
     
            For i = 4 To 3 + decalage
                Dim element1 As New element
                Dim listc1 As New List(Of couple)
                Dim couple1 As New couple
                Dim nbrcouple As Integer
     
                valeurs = separerligneencase(liste.Item(i))
                nbrcouple = valeurs(3)
                element1.type = valeurs(2)
                listc1.Clear()
     
                For k = 1 To nbrcouple
                    couple1.debut = valeurs(2 + 2 * k)
                    couple1.fin = valeurs(3 + 2 * k)
                    listc1.Add(couple1)
                Next k
     
                element1.indices = listc1
                attendu.Add(element1)
                listc1.Clear()
     
            Next
            Return attendu
     
        End Function
    Au fait, plutôt que de tout parser à la main, regarde si tu ne peux pas plutôt utiliser la classe TextFieldParser, qui sert justement à lire des fichiers CSV

  3. #3
    Membre confirmé
    Inscrit en
    Juillet 2010
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 70
    Par défaut
    ça marche,
    merci !

    je regarde pour TextFieldParser...

  4. #4
    Membre confirmé
    Inscrit en
    Juillet 2010
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 70
    Par défaut
    Bonjour,

    J'ai rencontré un probleme similaire à celui pour lequel vous avez proposé une solution qui marchait.

    la solution ne marche pas pour ce probleme
    je suis au coeur d'une imbrication de de boucle,
    je crée pourtant deux nouvelles instances que je réinitialise (nothing)


    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
    Public Function Test_Disponibilite_Piquage(ByVal BDPiquageCopie As List(Of Piquage)) As Collection
     
            Dim reponse As Boolean = True
            Dim reponsetemp As Boolean
            Dim listeCPiquage As New List(Of Caracteristique_Piquage)
     
            Dim sortie As New Collection
     
            Dim BDsortie As New List(Of Piquage)
            For i = 0 To LCP.Count - 1
     
                reponsetemp = False
                For j = 0 To BDPiquageCopie.Count - 1
                    'selection des piquage de bon diametre
                    If LCP.Item(i).Diametre = BDPiquageCopie.Item(j).caracteristiquePiquage.Diametre Then
                        'selection des piquage de critere chute accompagnée ou non
                        If LCP.Item(i).ChuteAccompagnee = BDPiquageCopie.Item(j).caracteristiquePiquage.ChuteAccompagnee Then
                            'selection des piquage de bon type de regard
                            If BDPiquageCopie.Item(j).Type_Regard = Cunette.Type_Regard Then
                                's'il s'agit d'une regard de 1000, condition supplémentaire: critere semi PMF
                                If Cunette.Type_Regard = 1000 Then
                                    If (BDPiquageCopie.Item(j).PMF = "STA" And (Cunette.PMF = "INJ" Or Cunette.PMF = "STA")) Or (BDPiquageCopie.Item(j).PMF = "CON" And Cunette.PMF = "CON") Then
                                        reponsetemp = True
                                    End If
                                End If
                            Else
                                reponsetemp = True
                            End If
     
                            If reponsetemp = True Then
     
                                Dim Piquagei As New Piquage
                                Dim CPiquagei As New Caracteristique_Piquage
     
                                Piquagei = BDPiquageCopie.Item(j)
     
                                CPiquagei = LCP.Item(i)
                                'listeCPiquage.Add(LCP.Item(i))
     
                                Piquagei.caracteristiquePiquage = CPiquagei
                                'listeCPiquage.Item(listeCPiquage.Count - 1)
                                'BDsortie.Add(BDPiquageCopie.Item(j))
                                'BDsortie.Item(BDsortie.Count - 1).caracteristiquePiquage = listeCPiquage.Item(listeCPiquage.Count - 1)
                                'BDsortie.Add(Piquagei)
     
                                Piquagei = Nothing
                                CPiquagei = Nothing
     
                                Exit For
                            End If
                        End If
                    End If
                Next
                reponse = reponse And reponsetemp
            Next
     
            sortie.Add(reponse)
            sortie.Add(BDsortie)
            Return sortie
        End Function
    ou plus simplement
    si je crée dans un premier temps BDsortie sans CPiquage qui vérifie les condition adéquate puis, je remplis BDsortiebis a partir de BDsortie comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    For i = 0 To BDsortie.Count - 1
                Dim Piquagei As New Piquage
                Dim CPiquagei As New Caracteristique_Piquage
     
                Piquagei = BDsortie.Item(i)
                CPiquagei = LCP.Item(i)
                Piquagei.caracteristiquePiquage = CPiquagei
     
                BDsortiebis.Add(Piquagei)
            Next
    d'après les observations que j'ai pu faire, si des élements de LCP (Cpiquage) sont identiques, alors les élements de BDsortie le seront aussi

    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
    Public Class Piquage
        Inherits ProduitRehau
        Property Type_Regard As Integer
        Property PMF As String
        Property caracteristiquePiquage As Caracteristique_Piquage
     
        Public ReadOnly copie() As Piquage
            get copie().typeregard
     
    End Class
     
    Public Class Caracteristique_Piquage
        Property HFO As Integer
        Property Angulation As Single
        Property Diametre As Integer
        Property ChuteAccompagnee As Boolean
    End Class
    Savez vous pourquoi l'astuce que vous aviez proposée dans le cas précédant ne marche plus dans ce cas?

Discussions similaires

  1. Variable d'une clause where avec quote
    Par kcizth dans le forum Langage SQL
    Réponses: 1
    Dernier message: 17/04/2008, 15h43
  2. Modification d'un texte dans une fenetre "d'erreur"
    Par PAUL87 dans le forum Access
    Réponses: 8
    Dernier message: 21/10/2005, 13h12

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