6

这是我第一次来这里,我正在努力解决这个问题。我有这段代码:

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 行的日志文件。有没有办法加快这个过程?

4

6 回答 6

3

我会采取不同的方法并使用 LINQ,如下所示:

lista.Items = lista.Items.Where(x=>x.SubItems[1].Text.ToLower.Contains(Text)).AsParallel().ToList();

基本上,重建列表一次,而不是一次又一次地尝试删除单个项目。

于 2013-05-31T16:19:55.730 回答
2

最简单的选择是使用列表自己的RemoveAll 方法

list.RemoveAll(x => !x.SubItems[1].Text.ToLower().Contains(Text))

附言

您可能想在实际比较中寻找速度增益。如果您的要求符合要求,使用String.Compare会快得多。如果您想检查子字符串,我建议您使用ToUpperInvariant与不变性相关的事项 -它旨在更快

于 2013-05-31T16:30:40.347 回答
2
ListViewItem[] allElements = new ListViewItem[listView1.Items.Count];
listView1.Items.CopyTo(allElements, 0);
List < ListViewItem > list = allElements.ToList();
list.RemoveAll(item => item.SubItems[1].Text.ToLower().Contains(TextToFind) == false);
listView1.BeginUpdate();
listView1.Clear();
listView1.Items.AddRange(list.ToArray());
listView1.EndUpdate();

第一条规则永远不会在 for 循环中更新列表。您的逻辑只会运行到列表的一半。我想这不是你想要的。
我已经看到即使使用 BeginUpdate 和 EndUpdate 操作 listview.items 也很慢。关键是在外部进行操作(在列表中左右),然后用 AddRange 重新填充列表(这比 Add 快得多)。

于 2013-05-31T17:02:27.990 回答
0

您可以将其粘贴在后台工作人员中并让它自己执行此操作。因此,在此过程发生时,您的用户仍然可以使用该程序。

于 2013-05-31T16:36:12.323 回答
0

如果你在 for 循环中删除一个项目,你应该将计数器设置为少 1,这样你就不会错过一个。因为您删除了 [i],所以 [old i+1] 变成了 [new i](Items.Count 也减少了 1)并且您将错过检查 [new i]。

例如: ListView.Items.Remove[i]; i--;

于 2021-04-21T11:57:13.983 回答
0

列表动态访问很慢,更适合迭代。我建议在列表视图之外操作数据(也许通过在遍历源集合时将要显示的行一次复制到一个临时列表中),然后在最后分配给列表视图。这可以在不同的线程上完成(以提高 UI 性能)并且不需要昂贵的查找。

于 2021-04-21T13:01:48.783 回答