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.