数组重复一个值

时间:2011-11-12 16:16:47

标签: c# arrays repeat fill

我填充了这个对象的数组,我想我已经填好了,直到我要求重复我刚刚填充的内容并看到它们都是相同的结果。我知道这很简单,但我现在很想念它。

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 个答案:

答案 0 :(得分:3)

您只是初始化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 :(得分:1)

在每次迭代时,为参考基因分配新的基因组(geneList),然后为参考基因[i]分配基因指向的对象的地址。依此类推,最后你将始终将所有对象作为最后生成的Genome()的值,因为你会覆盖基因指向的内存位置。尝试将新基因组(geneList)直接分配给gen [i]。

答案 2 :(得分:0)

移动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-array,每次在循环内修改,但每个Genome实例使用相同的geneList-array。 (也就是说,它们都使用与该数组相同的引用)。