85 votes

Comment créer une nouvelle copie profonde (clone) d'un List<T> ?

Dans le morceau de code suivant,

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;

namespace clone_test_01
{

    public partial class MainForm : Form
    {

        public class Book
        {
            public string title = "";

            public Book(string title)
            {
                this.title = title;
            }
        }

        public MainForm()
        {
            InitializeComponent();

            List<Book> books_1 = new List<Book>();
            books_1.Add(  new Book("One")  );
            books_1.Add(  new Book("Two")  );
            books_1.Add(  new Book("Three")  );
            books_1.Add(  new Book("Four")  );

            List<Book> books_2 = new List<Book>(books_1);

            books_2[0].title = "Five";
            books_2[1].title = "Six";

            textBox1.Text = books_1[0].title;
            textBox2.Text = books_1[1].title;
        }
    }

}

J'utilise un Book pour créer un objet List<T> et je l'alimente avec quelques éléments en leur donnant un titre unique (de "un" à "cinq").

Je crée ensuite List<Book> books_2 = new List<Book>(books_1) .

A partir de là, je sais qu'il s'agit d'un clone de l'objet liste, MAIS les objets livres de book_2 sont toujours une référence des objets du livre dans books_1 . Elle est prouvée en apportant des modifications aux deux premiers éléments de books_2 puis en vérifiant ces mêmes éléments de book_1 dans un TextBox .

books_1[0].title and books_2[1].title ont en effet été remplacées par les nouvelles valeurs de books_2[0].title and books_2[1].title .

MAINTENANT LA QUESTION

Comment créer une nouvelle copie papier d'une List<T> ? L'idée est que books_1 y books_2 deviennent complètement indépendantes les unes des autres.

Je suis déçu que Microsoft n'ait pas proposé une solution nette, rapide et facile, comme Ruby le fait avec l'application clone() método.

Ce qui serait vraiment génial de la part des aides, c'est d'utiliser mon code et de le modifier avec une solution viable pour qu'il puisse être compilé et fonctionner. Je pense que cela aiderait vraiment les débutants qui essaient de comprendre les solutions proposées pour ce problème.

EDIT : Notez que le Book pourrait être plus complexe et avoir plus de propriétés. J'ai essayé de garder les choses simples.

-3voto

Une méthode simple et directe pour copier n'importe quelle liste générique :

List<whatever> originalCopy=new List<whatever>();//create new list
originalCopy.AddRange(original);//perform copy of original list

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X