有一个数组和一个相同类型的列表。在循环中,我更改了数组,并在每次更改后将其添加到列表中(在循环结束时,我想获得由更改产生的所有数组的列表)。但是当列出它的所有元素是相同的时,它们与添加到列表中的最后一个数组相同。为什么会这样?
byte[,] mat = new byte[3, 3];
List<byte[,]> list = new List<byte[,]>();
for (int m = 0; m < 9; ++m)
{
byte i = 0;
byte j = 0;
// Search for an empty cell (zero)
bool flag = false;
for (i = 0; i < 3; ++i)
{
for (j = 0; j < 3; ++j)
if (mat[i, j] == 0)
{
flag = true;
break;
}
if (flag) break;
}
// Adding a changed array to the list
mat[i, j] = 1;
list.Add(mat);
// List all items in the list
foreach (byte[,] a in list)
{
PrintMatrix(a);
}
}
答案 0 :(得分:2)
mat
是一个对象。在循环内部,您不断向mat
添加相同的对象List
。完成后,您有一个List
,其中包含指向一个对象mat
的多个指针,这些指针完全相同。
想象一下邮局有编号的邮箱。其中一个框(例如15个)是您的mat
Array
变量。因此,在我们的类比中,mat
为15.您的List
list
是一张纸。每次在循环中你在邮箱中放入不同的东西,然后你在纸的底部写15。
当你拿到最后一篇论文然后去每个邮箱看看它里面有什么内容时,你只需要去第15页并看到同样的事情。
BTW,我认为你的打印循环位置错误 - 它应该在m
循环之外。
要解决此问题,您需要复制mat
以添加到List
:
var mat = new byte[3, 3];
var list = new List<byte[,]>();
for (int m = 0; m < 9; ++m) {
byte i, j = 0;
// Search for an empty cell (zero)
bool flag = false;
for (i = 0; i < 3; ++i) {
for (j = 0; j < 3; ++j)
if (mat[i, j] == 0) {
flag = true;
break;
}
if (flag) break;
}
// Adding a changed array to the list
mat[i, j] = 1;
list.Add((byte[,])mat.Clone());
}
// List all items in the list
foreach (byte[,] a in list) {
PrintMatrix(a);
}