Удалить определенные элементы из списка в MFC - PullRequest
0 голосов
/ 06 июня 2011
CString dance[] = {L"Atb", L"Tiesto", L"Madonna", L"Paul van Dyk", L"Armin van Burren", L"Jennifer Lopez"};

for(int i = 0; i < m_ItemsListBox.GetCount(); ++i)
{
    CString item;
    int length = m_ItemsListBox.GetTextLen(i);
    m_ItemsListBox.GetText(i, item.GetBuffer(length));
    for(int j = 0; j < sizeof(dance)/sizeof(*dance); ++j)
    {
        if(item != dance[j])
        {
            m_ItemsListBox.DeleteString(i);
        }
    }
}

Я пытаюсь удалить из списка (m_ItemsListbox) все элементы, которые не являются частью массива CString. Но то, как я его кодировал, не работает, потому что, если первый элемент отличается от другого, он удалит его без поиска во всем массиве.

Не казалось трудной задачей, но я действительно не представляю, как это сделать. Я думаю, что одним из способов должно быть использование CList вместо массива, потому что в нем есть метод find (), но мне это не нравится, потому что я должен вручную добавить все элементы, у вас, ребята, есть другая идея? Или решение CList является единственным?

Извините, я новичок в MFC. Спасибо за ваше время.

Ответы [ 2 ]

2 голосов
/ 06 июня 2011

Хммм. Мне было бы неудобно удалять вещи из списка, в то время как итерации по элементам в списке, кажется, вызывают проблемы в будущем.Честно говоря, вы могли бы сделать что-то вроде этого, я только что собрал вместе - создайте список всех индексов элементов, которые вы хотите удалить, и удалите их в конце.

CList<int, int> ListIndexItemsToRemove;

for(int i = 0; i < m_ItemsListBox.GetCount(); ++i)
{
    CString item;
    int length = m_ItemsListBox.GetTextLen(i);
    m_ItemsListBox.GetText(i, item.GetBuffer(length));

    bool isMatchFound = false;
    for(int j = 0; j < sizeof(dance)/sizeof(*dance); ++j)
    {
        if(item == dance[j])
        {
            isMatchFound = true;
        }
    }
    if (!isMatchFound)
         ListIndexItemsToRemove.AddHead(i);
}
for(int i = 0; i < ListIndexItemsToRemove.GetCount(); ++i)
      m_ItemsListBox.DeleteString(ListIndexItemsToRemove.GetAt(ListIndexItemsToRemove.FindIndex(i));

но - может быть, лучшеочистите весь список и пополняйте его каждый раз, когда что-то меняется, как говорит Мартин (если это ни на что не влияет.

2 голосов
/ 06 июня 2011

Для динамических списков я склонен хранить данные в своей собственной переменной и очищать / заново заполнять список при изменении этих данных.Тем более, что список становится больше, повторное добавление строк, как правило, происходит намного быстрее, чем поиск по списку и / или оригинальному источнику.

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