Как ускорить добавление элементов в ListView?C#

Место общения программистов C#
Ответить
Anonymous
 Как ускорить добавление элементов в ListView?

Сообщение Anonymous »

Я добавляю несколько тысяч (например, 53,709) элементов в список Winforms.

Код: Выделить всё

foreach (Object o in list)
{
ListViewItem item = new ListViewItem();
RefreshListViewItem(item, o);
listView.Items.Add(item);
}
< /code>

Это работает очень плохо. Очевидное первое исправление состоит в том, чтобы вызовать negnupdate/endupdate 
.

Попытка 2 : 3,106 мс

Код: Выделить всё

listView.BeginUpdate();
foreach (Object o in list)
{
ListViewItem item = new ListViewItem();
RefreshListViewItem(item, o);
listView.Items.Add(item);
}
listView.EndUpdate();
< /code>

Это лучше, но все же порядок слишком медленно. Давайте отделяем создание ListViewItems от добавления ListViewItems, поэтому мы находим фактический виновник: < /p>

[b] Попытка 3 < /strong>: 2631 мс < /code> < /p>

var items = new List[*]();
foreach (Object o in list)
{
ListViewItem item = new ListViewItem();
RefreshListViewItem(item, o);
items.Add(item);
}

stopwatch.Start();

listView.BeginUpdate();
foreach (ListViewItem item in items)
listView.Items.Add(item));
listView.EndUpdate();

stopwatch.Stop()
< /code>

Настоящее узкое место добавляет элементы. Давайте попробуем преобразовать его в addrange 
, а не Foreach

Попытка 4: [/b] 2,182 мс

Код: Выделить всё

listView.BeginUpdate();
listView.Items.AddRange(items.ToArray());
listView.EndUpdate();
< /code>

немного лучше. Давайте убедитесь, что узкое место нет в ToArray () 


Попытка 5: 2,132 мс

Код: Выделить всё

ListViewItem[] arr = items.ToArray();

stopwatch.Start();

listView.BeginUpdate();
listView.Items.AddRange(arr);
listView.EndUpdate();

stopwatch.Stop();
< /code>

Ограничение, кажется, добавляет элементы в ListView. Может быть, другая перегрузка addrange 
, где мы добавляем a listview.listviewitemcollection , а не массив

Попытка 6: 2,141 мс

2,141 мс

Код: Выделить всё

listView.BeginUpdate();
ListView.ListViewItemCollection lvic = new ListView.ListViewItemCollection(listView);
lvic.AddRange(arr);
listView.EndUpdate();
< /code>

Хорошо, это не лучше. alt = "Введите описание изображения здесь" src = "https://i.sstatic.net/gs10n.png"/> 

[b] проверить [/b] 
[*]  [b] step 2  - убедитесь, что список не пытается сортировать элементы. />   

 Проверка [/b] 
[*]  [b] step 3  - askfoverfl />   

 check [/b] 


 


 


. режим; Поскольку вы не/не можете «добавить» элементы в виртуальное представление списка (вы устанавливаете Virtuallistsize 
). К счастью, мой вопрос не о представлении списка в виртуальном режиме. < /P>

Есть ли что -то, что мне не хватает, что может объяснить добавление элементов в Listview, который так медленный? Потому что я могу написать код, который делает это за 394 мс < /code>: < /p>

ListView1.Items.BeginUpdate;
for i := 1 to 53709 do
ListView1.Items.Add();
ListView1.Items.EndUpdate;
< /code>

, который по сравнению с эквивалентным кодом C# 1 349 MS < /code>: < /p>

listView.BeginUpdate();
for (int i = 1; i

на порядок быстрее.>

Подробнее здесь: https://stackoverflow.com/questions/900 ... a-listview
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»