Проблемы с удалением элементов в списке списка в C # - PullRequest
2 голосов
/ 20 ноября 2011

У меня есть программа, в которой у меня есть три класса 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
{
    ...
}

В моей основной функции я сначала заполняюBList и CList в каждом из этих элементов BList.В BList есть N элементов, и каждый из элементов BList содержит M элементов в CList.Затем я делаю следующее.

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();
}

Когда я это делаю, я получаю следующую проблему.Когда я пытаюсь удалить элементы в CList, принадлежащие элементу BList [0], соответствующие элементы в CList в BList [1], BList [2] ... BList [N-1] также удаляются.Ниже приведен вывод, который я вижу при запуске программы.

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 ]

2 голосов
/ 20 ноября 2011

Как вы заполнили списки BLists и CLists под A?может быть, вы создали один CList и использовали его для инициализации всех объектов B?

2 голосов
/ 20 ноября 2011

А как насчет использования очереди B или очереди C вместо списков?Они должны отражать поведение, которое вы хотите, более естественно (я бы исключил из него циклы while (queue.Count> 0) {...}).Кроме того, похоже, что проблема в том, где вы заполняете списки.Точнее, я думаю, что ваши ссылки могут быть испорчены.Код оттуда поможет.

1 голос
/ 20 ноября 2011

Похоже, проблема в том, как вы создаете элементы B и C в конструкторе A.Используете ли вы новое ключевое слово для создания каждого отдельного элемента B, элемента C и списка элементов C?Если вы просто копируете их в какой-то момент, то они все равно могут быть тем же реальным объектом в памяти, и изменение или удаление одного из них может сделать то же самое и с остальными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...