Como criar uma nova cópia profunda (clone) de uma List <T>?

No seguinte trecho de código,

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;
        }
    }

}

Eu uso umBook tipo de objeto para criar umList<T> e eu o preencho com alguns itens, dando-lhes um título único (de 'um' a 'cinco').

Então eu crioList<Book> books_2 = new List<Book>(books_1).

A partir deste ponto, eu sei que é um clone do objeto de lista, MAS os objetos do livro debook_2 ainda são uma referência dos objetos do livro embooks_1. Está provado fazendo mudanças nos dois primeiros elementos dobooks_2e, em seguida, verificar esses mesmos elementos debook_1 em umTextBox.

books_1[0].title and books_2[1].title foram realmente alterados para os novos valores debooks_2[0].title and books_2[1].title.

AGORA A PERGUNTA

Como criamos uma nova cópia impressa de umList<T>? A ideia é quebooks_1 ebooks_2 tornam-se completamente independentes um do outro.

Estou decepcionado A Microsoft não ofereceu uma solução simples, rápida e fácil como Ruby está fazendo com oclone() método.

O que seria realmente incrível de ajudantes é usar o meu código e alterá-lo com uma solução viável para que possa ser compilado e trabalhe. Acho que isso realmente ajudará os novatos que estão tentando entender as soluções oferecidas para esse problema.

EDIT: Note que oBook A classe pode ser mais complexa e ter mais propriedades. Eu tentei manter as coisas simples.

questionAnswers(8)

yourAnswerToTheQuestion