我是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
}
非常感谢。
答案 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
。然后可以单独修改列表。
如果您想进一步说服自己,请将相同的(非readonly
)Rectangle
分配到列表的两个位置,然后尝试修改一个。它将修改另一个。