C# 将数组添加到列表中而不重复

C# 将数组添加到列表中而不重复,c#,arrays,list,collections,C#,Arrays,List,Collections,存在相同类型的数组和列表。在一个循环中,我更改了数组,每次更改后我都将其添加到列表中(在循环结束时,我希望获得由更改产生的所有数组的列表)。但当列出其所有元素时,它们与添加到列表中的最后一个数组相同。为什么会这样 byte[,] mat = new byte[3, 3]; List<byte[,]> list = new List<byte[,]>(); for (int m = 0; m < 9; ++m)

存在相同类型的数组和列表。在一个循环中,我更改了数组,每次更改后我都将其添加到列表中(在循环结束时,我希望获得由更改产生的所有数组的列表)。但当列出其所有元素时,它们与添加到列表中的最后一个数组相同。为什么会这样

        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);
            }
        }
byte[,]mat=新字节[3,3];
列表=新列表();
对于(int m=0;m<9;++m)
{
字节i=0;
字节j=0;
//搜索空单元格(零)
布尔标志=假;
对于(i=0;i<3;++i)
{
对于(j=0;j<3;++j)
if(mat[i,j]==0)
{
flag=true;
打破
}
如果(旗帜)断裂;
}
//将更改的数组添加到列表中
mat[i,j]=1;
列表。添加(mat);
//列出列表中的所有项目
foreach(列表中的字节[,]a)
{
印刷矩阵(a);
}
}

mat
是一个对象。在循环内部,您不断将相同的对象
mat
添加到
列表中。完成后,将有一个
列表
,其中包含指向同一对象的多个指针
mat
,这些指针是相同的

想象一下,一个邮局的邮箱是有编号的。其中一个框(例如15)是
mat
数组
变量。所以在我们的类比中,
mat
是15。您的
列表
列表
是一张纸。每次循环时,你在邮箱里放上不同的东西,然后在纸的底部写上15个

当你拿着最后一篇论文去每个邮箱看里面都有什么时,你只需继续去15号邮箱看同样的东西

顺便说一句,我认为你的打印循环在错误的位置-它应该在
m
循环之外

要修复它,您需要制作一份
mat
的副本以添加到
列表中:

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);
}
var mat=新字节[3,3];
var list=新列表();
对于(int m=0;m<9;++m){
字节i,j=0;
//搜索空单元格(零)
布尔标志=假;
对于(i=0;i<3;++i){
对于(j=0;j<3;++j)
if(mat[i,j]==0){
flag=true;
打破
}
如果(旗帜)断裂;
}
//将更改的数组添加到列表中
mat[i,j]=1;
添加((字节[,])mat.Clone());
}
//列出列表中的所有项目
foreach(列表中的字节[,]a){
印刷矩阵(a);
}

mat
是一个对象。在循环内部,您不断将相同的对象
mat
添加到
列表中。完成后,将有一个
列表
,其中包含指向同一对象的多个指针
mat
,这些指针是相同的

想象一下,一个邮局的邮箱是有编号的。其中一个框(例如15)是
mat
数组
变量。所以在我们的类比中,
mat
是15。您的
列表
列表
是一张纸。每次循环时,你在邮箱里放上不同的东西,然后在纸的底部写上15个

当你拿着最后一篇论文去每个邮箱看里面都有什么时,你只需继续去15号邮箱看同样的东西

顺便说一句,我认为你的打印循环在错误的位置-它应该在
m
循环之外

要修复它,您需要制作一份
mat
的副本以添加到
列表中:

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);
}
var mat=新字节[3,3];
var list=新列表();
对于(int m=0;m<9;++m){
字节i,j=0;
//搜索空单元格(零)
布尔标志=假;
对于(i=0;i<3;++i){
对于(j=0;j<3;++j)
if(mat[i,j]==0){
flag=true;
打破
}
如果(旗帜)断裂;
}
//将更改的数组添加到列表中
mat[i,j]=1;
添加((字节[,])mat.Clone());
}
//列出列表中的所有项目
foreach(列表中的字节[,]a){
印刷矩阵(a);
}

mat[i,j]=1正好在您的
标志=true之前?因为i和j在for循环之外没有变化,所以您总是将0,0位置设为1。这不是答案,但我可以强烈建议您不要命名列表
列表
<代码>垫子
<代码>列表垫
<代码>材料清单
?应
材料[i,j]=1正好在您的
标志=true之前?因为i和j在for循环之外没有变化,所以您总是将0,0位置设为1。这不是答案,但我可以强烈建议您不要命名列表
列表
<代码>垫子
<代码>列表垫
<代码>材料清单
?这是什么意思?抱歉,我使用LINQPad作为试用代码,并留下了一些调试内容。这是什么意思?抱歉,我使用LINQPad作为试用代码,并留下了一些调试内容。