1

我是 C# 的新手,所以请多多包涵。

我需要使用列表或矩形列表。我的问题是,每当我为一个元素设置值时,也会设置其他元素。

例如,如果我的列表列表是“m_aRectWBLD”,大小为 2 x 4,当我设置“m_aRectWBLD [0][0]”时,“m_aRectWBLD [1][0]”也会被设置。

我正在使用 Visual Studio 2010 SP1。请让我知道我做错了什么。这是相关的代码。

    private List<List<Rectangle>> m_aRectWBLD = new List<List<Rectangle>>();
    static readonly Rectangle m_Rectdef = new Rectangle(0, 0, 0, 0);

    private void ResetAllData()
    {
        List<Rectangle> aRectZero = new List<Rectangle>();

        for (int i = 0; i != 4; i++)
            aRectZero.Add(m_Rectdef);

        m_aRectWBLD.Clear();                

        for (int i = 0; i != 2; i++)
        {
            m_aRectWBLD.Add(aRectZero);
        }

        m_aRectWBLD[0][0] = new Rectangle(0, 0, 100, 100);    // after doing this both
                                                              // m_aRectWBLD[0][0] and
                                                              // m_aRectWBLD[1][0]
                                                              // have the same Rectangle value

    }

非常感谢。

4

1 回答 1

2
private List<Rectangle> generateRectList()
{
    var aRectZero = new List<Rectangle>();
    for (int i = 0; i < 4; i++)
        aRectZero.Add(m_Rectdef);

    return aRectZero;
}

private void ResetAllData()
{        
    m_aRectWBLD.Clear();

    for (int i = 0; i < 2; i++)
    {
        m_aRectWBLD.Add(generateRectList());
    }

    m_aRectWBLD[0][0] = new Rectangle(0, 0, 100, 100);
}

您的问题是您将相同分配aRectZerom_aRectWBLD. C# 是引用性的,因此它实际上会将List相同内存地址中包含的相同内容放入m_aRectWBLD.

您的最终任务:m_aRectWBLD[0][0] = new Rectangle(0, 0, 100, 100);将新矩形放置在位于位置in0的列表中的位置。这两个指向完全相同的列表:0m_aRectWBLD

m_aRectWBLD[0] // List x
m_aRectWBLD[1] // List x

您需要做的是为每个职位创建一个 List职位。List我所做的更改为每个插槽创建了一个新的单独的。然后可以独立修改这些列表。

如果您想进一步说服自己,请将相同的(非readonly-)分配给Rectangle列表的两个位置并尝试修改一个。它将修改另一个。

附加点:

  • 在 for 循环中使用小于/大于谓词更为常见(首选 i > x 而不是 i!= x)
  • m_VARNAME 在 C# 中不太常见,更喜欢以小写开头的 CamelCase 本地/私有变量/函数。
于 2013-11-06T09:56:30.847 回答