Как сохранить уникальную копию объекта в списке, в данном случае это полуразрешимый неровный массив ячеек судоку - PullRequest
0 голосов
/ 15 февраля 2019

Как я могу хранить данные (list<list<objects>>) таким образом, чтобы я мог получить доступ к предыдущему состоянию?

Это для решателя судоку, написанного на c #.Я попытался сгенерировать список «более высокого уровня» (List<List<List<object>>>) и сохранить его в этом, однако кажется, что этот список хранит только указатель или ссылку на мой объект, так как изменения в дальнейшем также влияют на хранимые экземпляры.

void publics() // only in void for display purpose, acctualy declared in class
{
    List<List<Cell>> SBoard = new List<List<Cell>>(); // list used in calculations

    List<List<List<Cell>>> BoardListBackup = new List<List<List<Cell>>>(); // list to store SBoards

    int GuessLevel = 0; // to keep track of how many guesses
}
    void guess()
    {
        BoardListBackup.Add(SBoard); // store current board
        Console.WriteLine("stored copy of board");

        for (int i=0;i<9;i++)
        {
            for(int j=0;j<9;j++)
            {
                if (SBoard[i][j].Value == "0")
                {
                    BoardListBackup.Add(SBoard); // possibly saves an instance of list at current state
                    SBoard[i][j].Value = SBoard[i][j].Possibly[0].ToString(); // guess first possible value of first unfilled cell
                    GuessLevel++;
                    UpdatePossibleValues();
                    Console.WriteLine("Guessing [{0}],[{1}] = {2}", i, j, SBoard[i][j].Possibly[0].ToString());
                    PrintBoardValues();
                    if (error == false)
                    {
                        InsertObvious();
                    }
                    else if (error == true)
                    {
                        Console.WriteLine("Bad guess, reverting board");
                        SBoard = BoardListBackup[GuessLevel - 1]; // what is the problem here??? Board is not rewerting?
                        BoardListBackup.RemoveAt(BoardListBackup.Count-1); // uncertain of syntax here
                        SBoard[i][j].RemovePossible(SBoard[i][j].Possibly[0].ToString()); // remove wrong guess from options
                        GuessLevel--;
                        PrintBoardValues();
                    }
                }
            }
        }

Когда ошибка == true, я ожидаю, что SBoard вернется в состояние, сохраненное в BoardListBackup [GuessLevel-1], но оно просто останется в своем текущем состоянии.До сих пор я думаю, что единственное решение - это сохранить в виде текстового файла, но, поскольку мне нужно сохранить как значения ячеек, так и возможные значения для отдельных строк, я чувствую, что это будет сложная логика.

1 Ответ

0 голосов
/ 15 февраля 2019

в этом списке хранится только указатель или ссылка на мой объект.

За исключением типов значений, большинство экземпляров под капотом ссылаются на ячейку памяти.Имя может измениться, но основная ссылка не изменится. Технически все является ссылкой на память, но ссылочные типы в C # не меняются, в то время как типы значений получают новые ссылочные местоположения при изменении .

Я ожидаю, что SBoard вернется ксостояние сохранено ...

Какое состояние фактически сохранено?Нет никакого кода, чтобы сделать фактическое сохранение / снимок, потому что он только обновляет, ничего не сохраняется в буквальном смысле.

Как я могу хранить данные (список>) таким образом, чтобы я мог получить доступ к предыдущему состоянию?

Вам потребуется создать конструктор копирования класса, который выхотите сохранить и сохранить его в объекте стека LIFO.Затем, когда вам нужно, вернитесь , вернитесь назад / вставьте стек в нужное вам состояние.


См. C # Stack , чтобы начать работу.

...