2011-05-10 54 views
2

我有以下一段代码:数组的更改一个元件改变别人

Chromosome[] pop = new Chromosome[popSize];  
int[] initialGenes = new int[i]; 
for (int m = 0; m < i; m++) 
    initialGenes[m] = -1; 
    for (int j = 0; j < popSize; j++) 
    {     
     pop[j] = new Chromosome(graph, initialGenes); 
    } 

Chromosome是我的类有一个属性

public int[] Genes { get; set; } 

正如你可以看到我初始化数组染色体物体。问题是,当我试图改变的pop所有Genes[k]被改变的pop[i].Genes[k](例如pop[1].Genes[2] = 123)值(即

pop[0].Genes[2] == 123 
pop[2].Genes[2] == 123 

等)

谁能解释的问题是什么?
谢谢。 。

+3

创建initialGenes的新副本,它是由于 – manojlds 2011-05-10 16:07:53

+1

你可能要考虑具有染色体类实例化阵列,而不是传递一个数组实例的基因突变。正如你所看到的那样,对相同的数组实例进行多次引用可能会产生意想不到的问题。如果封装数据并通过GetGene和SetGene方法提供对基因的访问,染色体不再需要担心其他代码可能间接地破坏其状态。 – 2011-05-10 16:11:31

回答

5

更改您的Chromosome构造,使传递进来的数组的副本
我想,你的构造是这样的:

public Chromosome(int[] initialGenes) 
{ 
    Genes = initialGenes; 
} 

但它应该是这样的:

public Chromosome(int[] initialGenes) 
{ 
    Genes = new int[initialGenes.Length]; 
    Array.Copy(initialGenes, Genes, Genes.Length); 
} 
+0

谢谢。现在,我看到我的错误。 – 2011-05-11 09:01:35

2

这是因为你传递同一个对象的所有染色体clases。你应该为每个染色体类