我有一个程序,我有三个班级A,B和C. A包含作为B列表的成员,B包含作为C列表的成员。 A包含一个名为RemoveB()的方法,类似地,B包含一个名为RemoveC()的方法。 RemoveB()和RemoveC()分别删除BList和CList的第一个元素。
以下是它们的全貌:
class A
{
...
List<B> BList;
...
public void RemoveB()
{
this.BList.Removeat(0)
}
}
class B
{
...
List<C> CList;
...
public void RemoveC()
{
this.CList.Removeat(0)
}
}
class Trial
{
...
}
在我的main函数中,我首先在每个BList元素中填充BList和CList。 BList中有N个元素,每个BList元素在CList中包含M个元素。然后我做了以下几点。
A aObject = new A(); // Populates BList and CList.
for(int i = 0; i < N; i++)
{
Console.WriteLine("BList: {0} ({1})", i, aObject.BList[0].Count);
for (int j = 0; j < M; j++)
{
Console.WriteLine("CList: {0}", j);
aObject.BList[0].RemoveC();
}
aObject.RemoveB();
}
当我这样做时,我遇到以下问题。当我尝试删除属于元素BList [0]的CList中的元素时,BList [1],BList [2] ... BList [N-1]中的CList中的相应元素也被删除。 以下是我从运行程序中看到的输出。
BList 0 (M)
CList 0
CList 1
CList 2
.
.
.
CList M-1
BList 1 (0)
BList 2 (0)
BList 3 (0)
.
.
.
BList N-1 (0)
有人能告诉我为什么会发生这种情况吗?我在某处犯了一些基本错误。
答案 0 :(得分:2)
使用B的队列或C的队列而不是列表怎么样?它们应该更自然地反映你想要的行为(我会在while(queue.Count&gt; 0){...}循环时出列。此外,听起来问题是您填充列表的位置。更准确地说,我认为您的引用可能会被搞砸。那里的代码会有所帮助。
答案 1 :(得分:2)
你是如何在A下填充BLists和CLists的?也许你已经创建了一个CList并用它来初始化所有的B对象?
答案 2 :(得分:1)
看起来像是如何在A构造函数中创建B和C元素的问题。您是否使用new关键字创建每个单独的B元素和C元素以及C元素列表?如果您只是在某个时刻复制它们,那么它们可能仍然是内存中的相同实际对象,并且更改或删除其中一个也可以对其他对象执行相同的操作。