У меня есть цикл, который инициализирует список объектов со значениями, но как только он выходит из цикла, объекты становятся одинаковыми

55
5

Как видно из названия, я инициализирую объекты в списке через цикл. Но все они становятся идентичными, когда петля выходит. Во время цикла я вижу, что они не совпадают. но когда цикл выходит, они меняются на последний введенный объект.

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
}

//==============================================================================================================
//==============================================================================================================
//==============================================================================================================

У кого-то была аналогичная проблема: почему мой список объектов одинаковый? и здесь: Почему все значения в моем списке одинаковы?

Первоначально мой список объектов был статичным, но с тех пор я удалил его, и проблема осталась.

спросил(а) 2014-04-06T19:13:00+04:00 6 лет, 4 месяца назад
1
Решение
79

Проблема в том, что вы создаете только один экземпляр объекта перед циклом и устанавливаете свойства этого одного объекта. Fix:

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

В основном создайте свой объект внутри цикла, чтобы на каждой итерации вы выделили новый объект.

ответил(а) 2014-04-06T19:15:00+04:00 6 лет, 4 месяца назад
69

Вы добавляете один и тот же макет в список снова и снова, а не каждый раз создаете новый экземпляр макета. Переместите код, чтобы создать объект макета внутри цикла.

ответил(а) 2014-04-06T19:16:00+04:00 6 лет, 4 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема