Copier une list de class [Résolu]

cs_ShayW 3238 Messages postés jeudi 26 novembre 2009Date d'inscription 14 mars 2018 Dernière intervention - 14 avril 2013 à 17:39 - Dernière réponse : cs_ShayW 3238 Messages postés jeudi 26 novembre 2009Date d'inscription 14 mars 2018 Dernière intervention
- 18 avril 2013 à 16:08
Bonjour à tous

j'ai une classA
et une list of classA
Private list1 As New List(Of ClassA)
et aussi
Private list2 As New List(Of ClassA)

je veux copier la list1 à la list2 de façon qui
si je modifie un element de la list2 l'élement au
meme index de la list1 ne soit pas affecter
Private Sub copylist()
   list2.Clear()
   For Each item In list1
      Dim tr As New ClassA
       tr = item
       list2.Add(tr)
        Next
End Sub


le problème si je modifie un élement de la list2 le meme élément de la list1 est modifié

merci
Afficher la suite 

Votre réponse

9 réponses

Meilleure réponse
foliv57 423 Messages postés vendredi 17 novembre 2006Date d'inscription 15 juillet 2014 Dernière intervention - 18 avril 2013 à 14:23
3
Merci
MemberwiseClone est une petite astuce bien pratique pour éviter d'avoir à affecter chaque propriété du clone. Elle permet donc de faire :
Public Class ClassA
    Implements ICloneable

    Private _prop1 As String

    Public Function Clone() As Object Implements System.ICloneable.Clone
        Return Me.MemberwiseClone()
    End Function

End Class

à la place de
Public Class ClassA
    Implements ICloneable

    Private _prop1 As String

    Public Function Clone() As Object Implements System.ICloneable.Clone
        Dim monClone As New ClassA()
        monClone._prop1 = Me._prop1
        Return monClone
    End Function

End Class

On evite donc les
monClone._prop1 = Me._prop1


On va dire qu'elle simplifie la tâche. Par contre, on ne contrôle pas complètement son action.

Il faut donc faire attention à cette explication du MSDN
Si un champ est un type valeur, il est copié bit par bit. S'il s'agit d'un type référence, la référence est copiée, mais l'objet référencé ne l'est pas. Par conséquent, l'objet d'origine et son clone se réfèrent au même objet.


Qui explique que
Public Class ClassA
    Implements ICloneable

    Private _monB As ClassB

    Public Function Clone() As Object Implements System.ICloneable.Clone
        Return Me.MemberwiseClone()
    End Function

End Class

Public Class ClassB
    Implements ICloneable

    Private _prop1 As String

    Public Function Clone() As Object Implements System.ICloneable.Clone
        Return Me.MemberwiseClone()
    End Function

End Class


ne sera pas équivalent à
Public Class ClassA
    Implements ICloneable

    Private _monB As ClassB

    Public Function Clone() As Object Implements System.ICloneable.Clone
        Dim monClone As New ClassA()
        monClone._monB = CType(Me._monB.Clone(), ClassB)
        Return monClone
    End Function

End Class

Public Class ClassB
    Implements ICloneable

    Private _prop1 As String

    Public Function Clone() As Object Implements System.ICloneable.Clone
        Return Me.MemberwiseClone()
    End Function

End Class


Dans le deuxième exemple, le clone de ClassA est fait plus en profondeur car il clone aussi sa propriété qui est une référence à ClassB. MemberwiseClone n'aurait que copiée la référence.

Tout dépend la façon dont doit être cloné l'objet. Si les références ne doivent pas être clonées, il fait gagner de la ligne de code.

Merci foliv57 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 100 internautes ce mois-ci

Commenter la réponse de foliv57
Meilleure réponse
foliv57 423 Messages postés vendredi 17 novembre 2006Date d'inscription 15 juillet 2014 Dernière intervention - 18 avril 2013 à 15:38
3
Merci
Et juste pour info, voici un petit exemple basé sur la sérialisation pour copier la liste.
Using ms As New MemoryStream()
    Dim frm As New BinaryFormatter()
    frm.Serialize(ms, list1)
    ms.Seek(0, SeekOrigin.Begin)
    list2 = CType(frm.Deserialize(ms), List(Of ClassA))
End Using

La liste list2 est bien une copie distincte. Sa modification n'affecte pas list1.
Par contre, à utiliser avec modération. Attention aux dérives d'utilisation de la mémoire. Mais c'est toujours intéressant à savoir.

Merci foliv57 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 100 internautes ce mois-ci

Commenter la réponse de foliv57
foliv57 423 Messages postés vendredi 17 novembre 2006Date d'inscription 15 juillet 2014 Dernière intervention - 18 avril 2013 à 13:03
1
Merci
Bonjour ShayW,

Il faut cloner les éléments de la liste:
Private Sub copylist()
        list2.Clear()
        For Each item As ClassA In list1
            list2.Add(CType(item.Clone(), ClassA))
        Next
End Sub


Il faut bien entendu penser à implémenter la méthode de clonage.
Voici un exemple.
Public Class ClassA
    Implements ICloneable

    Private _prop1 As String

    Public Function Clone() As Object Implements System.ICloneable.Clone
        Dim monClone As New ClassA()
        monClone._prop1 = Me._prop1
        Return monClone
    End Function

End Class
Commenter la réponse de foliv57
Utilisateur anonyme - 14 avril 2013 à 18:06
0
Merci
Bonjour,
Ca ne fonctionne pas comme avec les listbox?

 For Rt As Integer = 0 To ListBox1.Items.Count - 1
            ListBox2.Items.Insert(Rt, ListBox1.Items.Item(Rt))
        Next


Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
Commenter la réponse de Utilisateur anonyme
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 14 avril 2013 à 18:20
0
Merci
Bonjour,
Voir probablement (à vérifier) l'utilisation de la méthode Addrange


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
Commenter la réponse de ucfoutu
NHenry 14274 Messages postés vendredi 14 mars 2003Date d'inscription 18 octobre 2018 Dernière intervention - 14 avril 2013 à 18:34
0
Merci
Bonjour,

Si tu utilises le même objet, c'est normal, il te faut copier ton objet, sinon, comme tu ajoutes seulement la référence vers l'objet, tu agit sur les 2 List.

v----Signature--------v----------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices.[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : ).[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualBasic (onglet Références dans les propriétés du projet).[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés/list
---
Mon site
Commenter la réponse de NHenry
cs_ShayW 3238 Messages postés jeudi 26 novembre 2009Date d'inscription 14 mars 2018 Dernière intervention - 14 avril 2013 à 21:23
0
Merci
Bonsoir
j'ai trouvé une solution utiliser le
Object.MemberwiseClone Method
msdn anglais
msdn français
Commenter la réponse de cs_ShayW
cs_ShayW 3238 Messages postés jeudi 26 novembre 2009Date d'inscription 14 mars 2018 Dernière intervention - 18 avril 2013 à 13:16
0
Merci
Bonjour foliv

quelle est la différence entre ton exemple
la méthode clone
et Object.MemberwiseClone, méthode
Commenter la réponse de cs_ShayW
cs_ShayW 3238 Messages postés jeudi 26 novembre 2009Date d'inscription 14 mars 2018 Dernière intervention - 18 avril 2013 à 16:08
0
Merci
Merci pour ces infos
on apprend tous les jours
Commenter la réponse de cs_ShayW

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.