Đây là lần đầu tiên tôi ở đây và tôi đang đấu tranh để giải quyết vấn đề này. Tôi có đoạn mã này:C# ListView.Items [i] .remove là rất chậm
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;
}
Phương pháp lista.items[i].remove
là cực kỳ chậm. lista
là ListView
và tôi đang làm việc trên tệp nhật ký lớn hơn 50.000 dòng. Có cách nào để tăng tốc quá trình không?
Tò mò ... có 'lista.Items.RemoveAt (i)' khác về tốc độ không? Có lẽ (phản trực giác) lớp phải quay lại và giải quyết chính chỉ mục đó. – DonBoitnott
Bạn không nên thay đổi kích thước của cấu trúc dữ liệu (loại bỏ các mục khỏi nó) trong vòng lặp For. Hãy thử viết lại vòng lặp mà không cần xóa nó. Ví dụ, đánh dấu các chỉ mục cần được loại bỏ trong vòng lặp for và sau đó loại bỏ chúng ra bên ngoài nó. –
@RezaShirazian Một cách rõ ràng không thể làm điều đó với 'foreach' ... Tôi tin rằng nó hợp lý ok để sử dụng' for' để loại bỏ các mục (cuối cùng một số đoạn mã phải làm điều đó anyway) - cũng rõ ràng là không chính xác bằng văn bản (như trong mẫu ở trên do bỏ qua các mục bên cạnh mục vừa xóa) là ý tưởng tồi. –