Copier une list de class

Résolu
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 - 14 avril 2013 à 17:39
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 - 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
A voir également:

9 réponses

foliv57 Messages postés 420 Date d'inscription vendredi 17 novembre 2006 Statut Membre Dernière intervention 15 juillet 2014 9
18 avril 2013 à 14:23
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.
3
foliv57 Messages postés 420 Date d'inscription vendredi 17 novembre 2006 Statut Membre Dernière intervention 15 juillet 2014 9
18 avril 2013 à 15:38
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.
3
foliv57 Messages postés 420 Date d'inscription vendredi 17 novembre 2006 Statut Membre Dernière intervention 15 juillet 2014 9
18 avril 2013 à 13:03
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
1
Utilisateur anonyme
14 avril 2013 à 18:06
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
0

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

Posez votre question
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
14 avril 2013 à 18:20
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.
0
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
14 avril 2013 à 18:34
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
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
14 avril 2013 à 21:23
Bonsoir
j'ai trouvé une solution utiliser le
Object.MemberwiseClone Method
msdn anglais
msdn français
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
18 avril 2013 à 13:16
Bonjour foliv

quelle est la différence entre ton exemple
la méthode clone
et Object.MemberwiseClone, méthode
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
18 avril 2013 à 16:08
Merci pour ces infos
on apprend tous les jours
0
Rejoignez-nous