簡體   English   中英

c# ListView.Items[i].remove 很慢

[英]c# ListView.Items[i].remove is very slow

這是我第一次來這里,我正在努力解決這個問題。 我有這段代碼:

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 行的日志文件。 有沒有辦法加快這個過程?

我會采用不同的方法並使用 LINQ,如下所示:

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

基本上,重建列表一次而不是試圖一遍又一遍地刪除單個項目。

最簡單的選擇是使用列表自己的RemoveAll 方法

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

聚苯乙烯

您可能希望在實際比較中尋找速度提升。 如果您的要求適合,使用String.Compare會快得多。 如果您想檢查子字符串,我建議將ToUpperInvariant用於與不變性相關的問題 -它旨在更快

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 快得多)。

你可以把它放在后台工作人員中,讓它自己做。 因此,在此過程發生時,您的用戶仍然可以使用該程序。

如果你在 for 循環中刪除一個項目,你應該將計數器設置為 1 少,這樣你就不會錯過一個。 因為您刪除 [i],[舊 i+1] 變成 [新 i](Items.Count 也減少 1)並且您將錯過檢查 [new i]。

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

列表的動態訪問速度很慢,更適合迭代。 我建議在列表視圖之外操作數據(也許通過在遍歷源集合時將要顯示的行一次復制到一個臨時列表中),然后在最后分配給列表視圖。 這可以在不同的線程上完成(以提高 UI 性能)並且不需要昂貴的查找。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM