为什么此数组中的每个项都会被最后一项的值覆盖?

时间:2016-07-02 03:09:00

标签: c# arrays forms

我正在开发一个C#Windows表单程序,我正在进行遗传算法基础知识的练习。我试图做的不是按预期工作如下:

我的代码初始化了两个锯齿状数组和一个普通数组。锯齿状数组各有20个项目,普通数组有8个。普通数组存储个体的基因组,锯齿状population数组存储这些individual数组的数组。

当我调用generate_population()时,它应该使用正确的长度初始化锯齿状数组中的每个数组,然后使用for循环填充所述数组并返回create_indiv()(该函数返回一个8项individual数组),然后通过访问填充数组的i索引并打印该值,将数组打印到列表框。

这一切都运行正常,它成功生成一组唯一的individual,并通过访问和打印填充数组中的特定索引来打印这些个体。

问题是,如果我运行generate_population()函数一次,然后尝试在另一个函数中使用population数组,它会显示每个索引值包含相同的individual - 最后一个在数组中生成。

示例:

generate_population()内生成后,population[][]显示自己被这些数组填充:

  • 12345678
  • 87654321
  • 13579063

如果我尝试迭代并在另一个函数中打印population[][]的所有值,在我调用generate_population()之后,我得到了这个:

  • 13579063
  • 13579063
  • 13579063

有没有人发现问题?这段代码并不代表完整的程序,只有我认为我将问题隔离到的部分。我90%确定问题发生在generate_population(),但我可能错了。 如有必要,我可以发布完整的程序。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        int count = 0;
        int count2 = 0;
        int[] individual = new int[8];
        int[][] population = new int[20][];
        int[][] workingpop = new int[20][];

        Random seed = new Random();

        public Form1()
        {
            InitializeComponent();
        }

        public int[] create_indv()
        {
            for (int i = 0; i <= 7; i++)
            {
                individual[i] = seed.Next(0, 10);
            }
            return individual;

        }

        public string genomestr(int[] indiv)
        {
            StringBuilder builder = new StringBuilder();
            foreach (int value in indiv)
            {
                builder.Append(value);
            }
            string fin = builder.ToString();
            return fin;
        }

        public int[][] generate_population(int number)
        {
            for (int i = 0;i < number; i++)
            {
                population[i] = new int[8];
                workingpop[i] = new int[8];
            }
            for (int i = 0; i < number; i++)
            {
                population[i] = create_indv();
                workingpop[i] = population[i];


                int l = i + 1;
                this.popchart.Items.Add("Creature #" + l + ": " + genomestr(population[i]));
            }
            return population;
        }

        private void pop_Click(object sender, EventArgs e)
        {
            popchart.Items.Clear();
            generate_population(20);
        }
    }
}

1 个答案:

答案 0 :(得分:0)

将此行放在方法create_indv()中:

int[] individual = new int[8];

你一直覆盖“个人”。

population[i]

指向相同的“个人”