2011-11-12 78 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。 (也就是說,它們都使用與該數組相同的引用)。

相關問題