Код: Выделить всё
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 Попытка 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 Попытка 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 Есть ли что -то, что мне не хватает, что может объяснить добавление элементов в 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
Мобильная версия