【发布时间】:2013-05-27 12:15:26
【问题描述】:
这是我第一次来这里,我正在努力解决这个问题。 我有这段代码:
try
{
progressBar1.Maximum = lista.Items.Count;
lista.BeginUpdate();
for (int i = 0; lista.Items.Count > i; i++)
//for (int i = lista.Items.Count - 1; -1 < i; i--)
{
if (lista.Items[i].SubItems[1].Text.ToLower().Contains(Text) == false)
{
lista.Items[i].Remove();
}
progressBar1.Value = progressBar1.Value + 1;
}
lista.EndUpdate();
progressBar1.Value = 0;
}
catch (Exception errore)
{
txt_info.Text = "" + errore.Message;
progressBar1.Value = 0;
}
lista.items[i].remove 方法非常慢。
lista 是 ListView,我正在处理大于 50,000 行的日志文件。
有没有办法加快这个过程?
【问题讨论】:
-
很好奇...
lista.Items.RemoveAt(i)的速度是否不同?也许(与直觉相反)该类必须返回并自行解析索引。 -
您不应在 For 循环中更改数据结构的大小(从中删除项目)。尝试在没有删除的情况下重新编写循环。例如标记需要在 for 循环中删除的索引,然后将它们删除。
-
@RezaShirazian One 显然不能用
foreach做到这一点...我相信使用for删除项目是合理的(最终还是有一些代码必须这样做) -显然也写错了(如上面的示例,由于跳过了刚刚删除的项目旁边的项目)是个坏主意。 -
DonBoitnott 是对的。 RemoveAt(i) 是答案 - 已验证。是的,循环中的逻辑没有意义。