Массив повторяет одно значение - PullRequest
0 голосов
/ 12 ноября 2011

Я заполнил массив этого объекта, и я думаю, что я заполняю его нормально, пока я не попрошу повторить то, что я только что заполнил, и увидеть, что все они - один и тот же результат.Я знаю, что это что-то простое, но я упускаю это прямо сейчас.

static void Main(string[] args)
{
    int numOFItems = 6;
    int population = 10;

    int[] geneList = new int[numOFItems];
    Genome[] gen = new Genome[population];
    Random rand = new Random();
    Genome gene;

    for (int i = 0; i < population; i++)
    {
        gen[i] = new Genome();
        for (int j = 0; j < numOFItems; j++)
        {
            geneList[j] = rand.Next(0, 4);
        }
        gene = new Genome(geneList);
        gen[i] = gene;
        Console.Out.Write("\n" + gen[i].ToString());
    }
    for (int i = 0; i < population; i++)
        Console.Out.Write("\n" + gen[i].ToString() + ";");
    Console.ReadLine();
}

class Genome
{
    int[] geneList;
    int numOFItems = 6;

    public Genome()
    {
        geneList = new int[numOFItems];
    }

    public Genome(int[] geneList)
    {
        this.geneList = geneList;
    }

    public int[] GeneList
    {
        get { return geneList; }
        set { geneList = value; }
    }

    public override string ToString()
    {
        return "" + GeneList[0] + GeneList[1] + GeneList[2] 
            + GeneList[3] + GeneList[4] + GeneList[5];
    }
}

Ответы [ 3 ]

3 голосов
/ 12 ноября 2011

Вы инициализируете geneList только один раз - поэтому каждый Genome содержит ссылку на один и тот же массив. Переместите ваше объявление и инициализацию geneList внутри цикла. Обратите внимание, что вы также создаете новый экземпляр Genome прямо в начале списка и затем перезаписываете его. Поэтому я думаю, что ваш цикл должен выглядеть так:

for (int i = 0; i < population; i++)
{
    int[] geneList = new int[numOFItems];
    for (int j = 0; j < numOFItems; j++)
    {
        geneList[j] = rand.Next(0, 4);
    }
    gen[i] = new Genome(geneList);
}
1 голос
/ 12 ноября 2011

На каждой итерации эталонному гену присваивается новый геном (geneList), затем эталонному гену [i] присваивается адрес объекта, на который указывает ген. И так далее, и так далее, в конце вы всегда получите все объекты равными значению последнего сгенерированного Genome (), потому что вы продолжаете перезаписывать область памяти, на которую указывает gene. Попробуйте назначить новый Genome (geneList) непосредственно gen [i].

0 голосов
/ 12 ноября 2011

Переместите объявление массива geneList так, чтобы оно было внутри цикла for:

        static void Main( string[] args )
        {
            int numOFItems = 6;
            int population = 10;


            Genome[] gen = new Genome[population];

            Random rand = new Random ();

            for( int i = 0; i < population; i++ )
            {

                int[] geneList = new int[numOFItems];

                for( int j = 0; j < numOFItems; j++ )
                {
                    geneList[j] = rand.Next (0, 4);
                }


                gen[i] = new Genome (geneList);

                Console.Out.Write ("\n" + gen[i].ToString ());
            }
            for( int i = 0; i < population; i++ )
            {
                Console.Out.Write ("\n" + gen[i].ToString () + ";");
            }
            Console.ReadLine ();
        }

(я немного упростил ваш код)

В противном случае вы используете только один массив geneList, который вы модифицируете каждый раз внутри цикла, но каждый экземпляр Genome использует один и тот же массив geneList. (То есть все они используют одну и ту же ссылку на этот массив).

...