Параметры объектов в моем списке меняются, даже если я клонирую список - PullRequest
0 голосов
/ 30 мая 2020

Доброе утро,

Я делаю программу, которая создает шаги из приведенного выше и добавляет их в общий список.

Вот мой код:

        List<List<Crêpe>> Solutions = new List<List<Crêpe>>(); 
        Solutions.Add(new List<Crêpe>(Ordre)); // 1.

        for (int i = NombreMax; i > 0; i--)
        {
            Ordre.Reverse(0, positionDuNombreAChercher); // 2.

            for (int n = 0; n < positionDuNombreAChercher; n++)
            {
                Ordre[n].FaceCraméBienPlacé = !Ordre[n].FaceCraméBienPlacé; // 3.
            }

            Solutions.Add(new List<Crêpe>(Ordre)); 

        }

I Я поставил несколько маркеров, чтобы объяснить вам мою проблему:

В 1 , Я клонирую свой список и добавляю его в «Решение».

В 2 , я переворачиваю список Ordre , , у которого больше нет ссылки на список, который я клонировал , потому что это клон и, следовательно, изменения не внесены в «Решение».

В 3 видно Я меняю параметры объекта в «Порядке» . Вот где и происходит ошибка! Поэтому я изменяю свои параметры в объекте, и мой список, который я клонирую , не должен изменять его объект параметра, потому что он был клонирован, но проблема в том, что список, который я клонировал в начале, также изменяет эти параметры объекта .

на заметку: она изменила свои настройки, но не свой порядок, как шаг 3 с этим списком.

Мне очень жаль, если это было непонятно, если вы хотите лучшего объяснения скажите мне.

Спасибо за помощь:)

РЕДАКТИРОВАТЬ: Вот объект:

internal class Crêpe
{
    internal int Nombre { get; set; }
    internal bool FaceCraméBienPlacé { get; set; }

    public Crêpe(int position, bool faceCraméBienPlacé)
    {
        Nombre = position;
        FaceCraméBienPlacé = faceCraméBienPlacé;
    }
}

1 Ответ

1 голос
/ 30 мая 2020

Вы скопировали список , но не скопировали блины !

Чтобы скопировать блины, вы можете написать метод GetCopy в Crêpe class:

public Crêpe GetCopy() => new Crêpe(Nombre, FaceCraméBienPlacé);

И затем используйте Select, чтобы создать копию каждого Crêpe, затем используйте ToList, чтобы создать новый список:

Solutions.Add(Ordre.Select(x => x.GetCopy()).ToList()); // 1.

Вам также следует изменить последнюю строку во внешнем l oop.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...