Jak utworzyć nową głęboką kopię (klon) listy <T>?
W następującym fragmencie kodu,
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;
}
}
}
Używam aBook
typ obiektu, aby utworzyćList<T>
i zapełniam go kilkoma elementami nadającymi im unikalny tytuł (od „jeden” do „pięć”).
Potem tworzęList<Book> books_2 = new List<Book>(books_1)
.
Od tego momentu wiem, że to klon obiektu listy, ALE obiekty książki zbook_2
są nadal odniesieniem z obiektów książki wbooks_1
. Udowodniono to poprzez wprowadzanie zmian w dwóch pierwszych elementachbooks_2
, a następnie sprawdzanie tych samych elementówbook_1
wTextBox
.
books_1[0].title and books_2[1].title
zostały rzeczywiście zmienione na nowe wartościbooks_2[0].title and books_2[1].title
.
TERAZ PYTANIE
Jak stworzyć nową wersję papierową aList<T>
? Chodzi o tobooks_1
ibooks_2
stać się całkowicie niezależni od siebie.
Jestem zawiedziony, że Microsoft nie zaoferował prostego, szybkiego i łatwego rozwiązania, takiego jak Rubyclone()
metoda.
To, co byłoby naprawdę niesamowite od pomocników, to używanie mojego kodu i zmienianie go za pomocą praktycznego rozwiązania, aby można było go skompilować i działać. Myślę, że to naprawdę pomoże nowicjuszom próbującym zrozumieć oferowane rozwiązania tego problemu.
EDYCJA: Zauważ, żeBook
klasa może być bardziej złożona i mieć więcej właściwości. Starałem się zachować prostotę.