C# 如何将对象的唯一副本存储在列表中,在本例中是一个半解析的数独单元格锯齿数组

C# 如何将对象的唯一副本存储在列表中,在本例中是一个半解析的数独单元格锯齿数组,c#,backtracking,sudoku,C#,Backtracking,Sudoku,如何以可以访问以前状态的方式存储数据(list) 这是一个用c#编写的数独解算器。我已经尝试生成一个“更高级别”的列表(list)并将其存储在该列表中,但是该列表似乎只存储指向我的对象的指针或引用,因为随后的更改似乎也会影响存储的实例 void publics() // only in void for display purpose, acctualy declared in class { List<List<Cell>> SBoard = new List&

如何以可以访问以前状态的方式存储数据(
list

这是一个用c#编写的数独解算器。我已经尝试生成一个“更高级别”的列表(
list
)并将其存储在该列表中,但是该列表似乎只存储指向我的对象的指针或引用,因为随后的更改似乎也会影响存储的实例

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();
                    }
                }
            }
        }
void publics()//仅在void中显示,在类中意外声明
{
List SBoard=new List();//计算中使用的列表
List BoardListBackup=新建列表();//用于存储SBoard的列表
int GuessLevel=0;//跟踪猜测的次数
}
无效猜测()
{
BoardListBackup.Add(SBoard);//存储当前板
Console.WriteLine(“存储的董事会副本”);
对于(int i=0;i
此列表仅存储指向我的对象的指针或引用

除值类型外,大多数实例都是对内存位置的引用。名称可能会更改,但基础引用不会更改。从技术上讲,所有内容都是对内存的引用,但C#中的引用类型不会更改,而值类型在更改时会获得新的引用位置

我希望SBoard恢复到保存状态

实际保存的状态是什么?没有代码来执行实际的保存/快照,因为它只进行更新,没有实际保存任何内容

如何以可以访问以前状态的方式存储数据(列表>

您需要为要存储的类创建一个副本构造函数,并将其存储在后进先出堆栈对象中。然后在需要时,返回,返回/弹出堆栈到您想要的状态



让您开始。

谢谢!后进先出堆栈似乎真的很有用,但我没有成功地实现它,假设它也只存储对对象的引用(如果没有进行其他配置)。我通过添加两个3d列表来解决我的问题,其中我分别存储了可能的值和值。