【问题标题】:add an array to the list without repeating将数组添加到列表中而不重复
【发布时间】:2018-01-18 00:28:32
【问题描述】:

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

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

【问题讨论】:

  • mat[i,j] = 1; 应该在您的flag = true; 之前吗?您总是将 0,0 位置设为 1,因为 i 和 j 在您的 for 循环之外没有改变。
  • 不是答案,但我可以强烈建议您不要命名列表list 吗? mats? listMats? matList?

标签: c# arrays list collections


【解决方案1】:

mat 是一个对象。在循环内部,您不断将相同的对象mat 添加到List。完成后,您将拥有一个 List,它由多个指向同一个对象 mat 的指针组成,它们是相同的。

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

当你拿着你的期末论文去每个邮箱看看里面有什么东西时,你只是一直走到第 15 号,看到的是同样的东西。

顺便说一句,我认为您的打印循环位置错误 - 它应该在 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);
}

【讨论】:

  • $"flag == {flag}".Dump(); 是什么意思?
  • 对不起,我用 LINQPad 做试用代码,留下了一些调试的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-18
  • 1970-01-01
  • 2014-09-01
  • 2018-05-02
  • 2016-02-27
相关资源
最近更新 更多