Bonjour
QQ sait-il la meilleure maniere de faire un clone d'une List<T>
J'ai essayé la methode ToList mais ca cree simplement une reference de la liste originale
Moi j'aimerais creer une veritable nouvelle liste indépendante !
Version imprimable
Bonjour
QQ sait-il la meilleure maniere de faire un clone d'une List<T>
J'ai essayé la methode ToList mais ca cree simplement une reference de la liste originale
Moi j'aimerais creer une veritable nouvelle liste indépendante !
Bonsoir,
Je ne suis pas sûr de comprendre ce que tu veux faire.
Si tu veux une seconde liste identique, pourquoi ne pas en créer une nouvelle et faire tout simplement une affectation? :koi:
NB: j'ai peut-être mal compris ce que tu veux faire :?Code:
1
2
3
4
5
6 //la liste de base que tu veux cloner List<T> maListe; List<T> maListeClonee = new List<T>; maListeClonee = maListe;
Si tu veux une shallow copy (i.e. dédoubler la liste sans dédoubler ses éléments) :Pour une copie profonde, il faut y aller à la mano, parce que le framework se contente de proposer l'interface ICloneable sans jamais en faire quoi que ce soit.Code:List<Truc> laCopie = new List<Truc>(loriginale);
J'ai vérifié avec Reflector :
Donc ça renvoie bien une nouvelle liste...Code:
1
2
3
4
5
6
7
8 public static List<TSource> ToList<TSource>(this IEnumerable<TSource> source) { if (source == null) { throw Error.ArgumentNull("source"); } return new List<TSource>(source); }
Mais les éléménts eux-mêmes ne sont pas copiés en revanche, les références pointent vers les mêmes objets, sauf s'ils sont de type valeur (struct)
Si je me rappelle bien, une solution, c'est de serializer ta liste sur un memorystream, et de le deserializer en List ;)
Je dois meme avoir un exemple qui traine qq part...Mais ou ? ;)
Bonsoir
Premierement encore un truc bizare que j'avais déja eu :
Entre ma question vers 17h32 et la Réponse de pvialatte a 23h56 il y a peu plusieurs autres réponses
Or je n'ai recu qu' UNE SEULE notification a 23h39 : celle de pvialatte
Cela étant, merci a tous mais je pense que la seule bonne methode (que j'ai pratiqué) est de le faire a mano.
Le but est en effet d'avoir deux liste distincte sans references communes !
Salu TomLev
Ben oui !Citation:
OK, donc en fait ce que tu voulais c'était pas seulement cloner la liste elle-même, mais tous les éléments de la liste ? Il y a une raison à ça ?
Et ce n'est pas a mon avis exceptionnel
Prenons un exemple
Je charge une liste de techniciens, (Classe info techniciens + liste Missions)
Le chargement des techniciens se fait une fois via un stream.
Au chargement des techniciens, les liste des missions de chaque techniciens sont vides
Ensuite je constitue des listes de missions par exemple lundi, mardi, etc
Et pour des raisons pratique j'ai envie d'avoir le tout dans des Listes distincte contenant les techniciens et les missions associées.
Une maniere asser souple est de dupliquer la listes de technicien originale et de constituer des listes de missions distincte
pas tout compris, mais si tu as un nombre fixe de techniciens (en base ou autre) je ne vois pas du tout en quoi c'est utile d'avoir plusieurs instances par technicien, ca prend de la mémoire pour rien et autant faire un accesseur partagé pour les retrouver
Salut Sperot
L'optimisation c'est mon data en C quand je peux gagner un bit je n'hésite jamais quand c'est utile.
Par contre j'aime aussi un code lisible, facile a maintenir et eviter les truc un peux complexe quand ca ne sert a rien.
Il y a toujours un compromis entre les deux
Dans le cas présent, je trouvais plus simple de maintenir et gerer des liste Distincte meme si une partie de l'information est redondante.
Le poids des quelques techniciens est négligeable par rapport aux listes de missions.
Tiens, par rapport a mon pénultième message
Je l'ai retrouve dans un vieux, vieux projet, je crois que ça marche ;)Code:
1
2
3
4
5
6
7
8
9
10
11 public Customer DeepCopy(){ BinaryFormatter formatter = new BinaryFormatter(); using (MemoryStream stream = new MemoryStream()){ formatter .Serialize(stream, this); stream.Seek(0, SeekOrigin.Begin); return (Customer)formatter .Deserialize(stream); } }
Faut faire super gaffe, quand même, avec le clonage d'objets. Il faut bien déterminer la profondeur de la copie que l'on veut, étudier les éventuels cycles de références, etc.
bref, c'est complexe, et c'est pour ça qu'il n'y a rien de natif, hormis la méthode protégée MemberWiseClone (qui clone y compris les méthodes abonnées aux events par exemple).
et de toute facon dans tout y a des risques, comme le multithreading par exemple