将相同的值分配给矩形列表中的所有元素

时间:2013-11-06 09:39:03

标签: c# list initialization rectangles

我是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

    }

非常感谢。

1 个答案:

答案 0 :(得分: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);
}

您的问题是您将aRectZero分配给m_aRectWBLD的两个位置。 C#是引用的,因此它将字面上将包含在同一内存地址的相同List放入m_aRectWBLD的两个不同的插槽中。

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

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

您需要做的是为每个职位创建 List。我所做的更改为每个广告位创建了一个新的,单独的List。然后可以单独修改列表。

如果您想进一步说服自己,请将相同的(非readonlyRectangle分配到列表的两个位置,然后尝试修改一个。它将修改另一个。

补充要点:

  • 在for循环中使用小于/大于谓词更常见(更喜欢i&gt; x而不是i!= x)
  • m_VARNAME在C#中不常见,更喜欢小写的起始CamelCase本地/私有变量/函数。