如何在列表中存储对象的唯一副本,在本例中是一个半解的锯齿状数独单元格数组
How to store unique copy of object in a list, in this case a semi solved jagged array of sudoku cells
如何以可以访问先前状态的方式存储数据 (list<list<objects>>
)?
这是用 c# 编写的数独解算器。我已经尝试生成一个 "higher level" 列表 (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] 中保存的状态,但它只是保持当前状态。到目前为止,我认为唯一的解决方案是另存为文本文件,但由于我必须同时保存单元格值和单个字符串的可能值,我觉得这将是一个困难的逻辑。
this list only stores a pointer or reference to my object
除了值类型,大多数实例在幕后都是对内存位置的引用。名称可能会更改,但基础引用不会。 从技术上讲,一切都是对内存的引用,但 C# 中的引用类型不会更改,而值类型会在更改时获得新的引用位置。
I expect SBoard to revert to the state saved ...
实际保存的是什么状态?没有执行实际 save/snapshot 的代码,因为它只执行更新,没有任何字面上的保存。
How can I store data (list>) in a way that I can access a previous state?
您需要为要存储的 class 创建一个复制构造函数,并将其存储在 LIFO 堆栈对象中。然后,当您需要时,返回,将堆栈back/pop移动到您想要的状态。
见C# Stack
让你开始。
如何以可以访问先前状态的方式存储数据 (list<list<objects>>
)?
这是用 c# 编写的数独解算器。我已经尝试生成一个 "higher level" 列表 (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] 中保存的状态,但它只是保持当前状态。到目前为止,我认为唯一的解决方案是另存为文本文件,但由于我必须同时保存单元格值和单个字符串的可能值,我觉得这将是一个困难的逻辑。
this list only stores a pointer or reference to my object
除了值类型,大多数实例在幕后都是对内存位置的引用。名称可能会更改,但基础引用不会。 从技术上讲,一切都是对内存的引用,但 C# 中的引用类型不会更改,而值类型会在更改时获得新的引用位置。
I expect SBoard to revert to the state saved ...
实际保存的是什么状态?没有执行实际 save/snapshot 的代码,因为它只执行更新,没有任何字面上的保存。
How can I store data (list>) in a way that I can access a previous state?
您需要为要存储的 class 创建一个复制构造函数,并将其存储在 LIFO 堆栈对象中。然后,当您需要时,返回,将堆栈back/pop移动到您想要的状态。
见C# Stack 让你开始。