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

时间:2017-08-09 23:29:13

标签: c# arrays list collections

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

        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);
            }
        }

1 个答案:

答案 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);
}