|
分類:[.NET 全般]
こんにちは。
以前に何度か質問させていただいたことがあるものです。
MemberwiseClone() によって、Individual[0]のGeneの中身をEliteにコピーしようとしました。
MemberwiseClone() を用いると、コピー元を変更してもコピーされたものに関しては変更されないとのことなので、
以下のコードのように、Individual[0]のGeneの中身をEliteにコピーし、その後にIndividual[0]の中身を変更し、
Individual[0]の中身と、Eliteの中身を出力してみたところ、Eliteの中身もIndividualと同様に変更されていしまっているようでした。
このように、Eliteの中身も一緒に書き換わってしまった原因を教えて頂けると助かります。
わかりにくいかもしれませんがよろしくお願いします。
using System;
public struct GeneType :ICloneable
{
public string[] Gene;
public int Fitness;
public GeneType(int geneNumber, int Fitness = 0)
{
this.Gene = new string[geneNumber];
this.Fitness = Fitness;
}
public object Clone()
{
return MemberwiseClone();
}
}
class Compose
{
public static void Main()
{
string[] Note = { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p" };
Random random = new Random();
int geneNumber = 16;
int indNumber = 20;
GeneType[] Individual = new GeneType[indNumber];
for (int i = 0; i < indNumber; i++)
{
Individual[i] = new GeneType(geneNumber);
for (int j = 0; j < geneNumber; j++)
{
int RandomNumber = random.Next(Note.Length);
Individual[i].Gene[j] = Note[RandomNumber];
}
}
GeneType Elite = new GeneType();
Elite = (GeneType)Individual[0].Clone();//EliteにIndividual[0]をコピー
//Individual[0]の中身を表示
for (int i = 0; i < geneNumber; i++)
{
Console.Write(Individual[0].Gene[i]);
}
Console.WriteLine("");
//Eliteの中身を表示
for (int i = 0; i < geneNumber; i++)
{
Console.Write(Elite.Gene[i]);
}
Console.WriteLine("");
//Individual[0]の中身を変更
for (int i = 0; i < geneNumber; i++)
{
int RandomNumber = random.Next(Note.Length);
Individual[0].Gene[i] = Note[RandomNumber];
}
//再びIndividual[0]の中身を表示
for (int i = 0; i < geneNumber; i++)
{
Console.Write(Individual[0].Gene[i]);
}
Console.WriteLine("");
//再びEliteの中身を表示
for (int i = 0; i < geneNumber; i++)
{
Console.Write(Elite.Gene[i]);
}
Console.WriteLine("");
}
}
|