リストをクローンでコピー

//通常のやつ ※こいつをリストにする

    public class Test : ICloneable

    {

        public int n;

 

        public Test(){}

        //コピーコンストラクタ

        public Test(Test ts)

        {        

       n = ts.n;

        }

        //クローン

        public object Clone()

        {

       return new Test(this);

        }

    }

 

//通常のやつのリストを持つやつ

   public class Game : ICloneable

    {

        public List<Test> test = new List<Test>();

 

        public Game(){}

        //コピーコンストラクタ

        public Game(Game g)

        {

       test = g.test.Select(v => v.Clone() as Test).ToList();

  //もしくは

#if _0

             foreach(var v in g.test)

                {

                   test.Add(v.Clone() as Test);

                 }

#endif

        }

 

        //クローン

        public object Clone()

        {

       return new Game(this);

        }

    }

 

static void Main(string[] args)

        {

 

            Test t = new Test();

 

            t.n = 100;

 

            Test t2 = t.Clone() as Test;

 

            Console.WriteLine(t2.n);

            t2.n = 200;

            Console.WriteLine(t2.n);

            Console.WriteLine(t.n);

            List<Test> t_list = new List<Test>();

            t_list.Add(t);

            t_list.Add(t2);

 

            foreach (var v in t_list)

            {

                Console.WriteLine(v.n);

            }

 

            Game g = new Game();

            g.test = t_list;

 

            foreach (var v in g.test)

            {

                Console.WriteLine(v.n);

            }

 

            Game g2 = g.Clone() as Game;

 

            foreach (var v in g2.test)

            {

                Console.WriteLine(v.n);

            }

        }

 

長くなってしまったが、最初にやっているのが、通常のクローンによるコピー。その後にリストになったやつをコピーする。

重要なのがリストの中身をすべてコピーするためにGameのコピーコンストラクタでいったんリストをばらす必要があり、その一つずつのコピーコンストラクタを呼び、コピーを行っている。