我有一个循环,它初始化一个带有值的对象列表,但是一旦它退出循环,对象就会变得相同

本文关键字:对象 循环 退出 列表 初始化 有一个 一个 | 更新日期: 2023-09-27 17:56:53

正如标题所暗示的那样,我正在通过循环初始化列表中的对象。但是当循环退出时,它们都变得相同。我可以在循环中看到它们不一样。但是当循环退出时,它们会更改为最后一个输入的对象。

public List<ElevationLayout> layoutList = new List<ElevationLayout>();
    public int layoutNumber { get; set; }
    public int worldWidth { get; set; }
    public Random seed { get; set; }
    public XYSize dimLeft { get; set; }

//I have narrowed down the problem to this method
    //==========================================================================================================================================================
    //==========================================================================================================================================================
    //==========================================================================================================================================================
    public void init(World world) {
        dimLeft = new XYSize();
        ElevationLayout layout = new ElevationLayout();
        dimLeft.y = 0;
        dimLeft.x = world.size.x;
        seed = new Random((int)DateTime.Now.Ticks);
        worldWidth = (int)((world.size.x / 6.4) + (world.size.x / 64) - 1);
        layoutNumber =  worldWidth + seed.Next(-2, 3);
        for (int i = 0; i < layoutNumber; i++)
        {
            layout.type = seed.Next(0, 2);
            layout.width = (world.size.x / layoutNumber) + seed.Next(0, ((dimLeft.x / layoutNumber) / 2) + 1);
            if (layout.width > dimLeft.x)
            {
                layout.width = dimLeft.x;
            }
            dimLeft.x -= layout.width;
            layout.height = seed.Next(world.size.y / 16, (world.size.y / 4) + 1);
            if (layout.height > dimLeft.y)
            {
                layout.height = dimLeft.y;
            }

            this.layoutList.Add(layout);
            Console.Write(this.layoutList[i].type); // here the objects are different
            if ((world.size.y -= layout.height) > dimLeft.y)
            {
                dimLeft.y = (world.size.y - layout.height);
            }
            if (dimLeft.x <= 0)
            {
                layoutNumber = i;
            }
        }
        Console.WriteLine();
                for (int y = 0; y < layoutNumber; y++)
                    Console.Write(this.layoutList[y].type); //but as soon as i exit the loop they are the same
    }
    //==============================================================================================================
    //==============================================================================================================
    //==============================================================================================================

有人在这里遇到了类似的问题:为什么我的对象列表都一样?在这里:为什么我列表中的所有值都相同?

最初我的对象列表是静态的,但后来我删除了它,问题仍然存在。

我有一个循环,它初始化一个带有值的对象列表,但是一旦它退出循环,对象就会变得相同

问题是在循环之前只创建对象的一个实例并设置该对象的属性。修复:

    for (int i = 0; i < layoutNumber; i++)
    {
          ElevationLayout layout = new ElevationLayout();

基本上在循环中创建您的对象,以便在每次迭代中分配一个新对象。

您一遍又一遍地将相同的布局添加到列表中,而不是每次都创建一个新的布局实例。移动代码以在循环中创建布局对象。