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初学者。谢谢你的时间。
答案 0 :(得分:2)
对于动态列表,我倾向于将数据存储在自己的变量中,并在数据更改时清除/重新填充列表。特别是当列表变得更大时,重新添加字符串往往比在列表和/或原始源中搜索更快。
答案 1 :(得分:2)
嗯,我不习惯从列表框中删除内容,而迭代列表框中的项目似乎是在寻找问题。 老实说,你可以做这样的事情,我只是鞭打在一起 - 构建一个你要删除的所有项目索引的列表,并在最后删除它们。
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));
但是 - 最好清除整个清单,并在每次发生变化时重新填写,如马丁所说(如果它不会影响任何事情。