リストをクローンでコピー
//通常のやつ ※こいつをリストにする
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のコピーコンストラクタでいったんリストをばらす必要があり、その一つずつのコピーコンストラクタを呼び、コピーを行っている。