2011-11-12 77 views
0

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

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

你只是初始化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); 
} 
+0

谢谢堆..是的,现在我明白了。大 – user1043281

1

在每次迭代的参考基因被赋予一个新的基因组(geneList),对象则引用根[i]是分配的地址通过基因指了指。等等等等,最后你总是会把所有的对象都变成最后生成的Genome()的值,因为你一直覆盖基因指向的内存位置。尝试将新的Genome(geneList)直接分配给gen [i]。

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

相关问题