删除C#中列表列表中元素的问题

时间:2011-11-20 00:39:34

标签: c# list nested

我有一个程序,我有三个班级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)

有人能告诉我为什么会发生这种情况吗?我在某处犯了一些基本错误。

3 个答案:

答案 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元素列表?如果您只是在某个时刻复制它们,那么它们可能仍然是内存中的相同实际对象,并且更改或删除其中一个也可以对其他对象执行相同的操作。