Ускорение времени вставки списка - PullRequest
0 голосов
/ 05 августа 2010

Мне нужно добавить 950 строк длиной 2500 символов в список. Метод, который я использую ниже, занимает 2,5 секунды, и в идеале он должен происходить менее чем за 500 мс.

Stopwatch sw = Stopwatch.StartNew();

listBox1.BeginUpdate();
listBox1.Items.AddRange(items.ToArray());
listBox1.EndUpdate();

sw.Stop();

Как лучше всего оптимизировать время вставки?

Спасибо.

Ответы [ 2 ]

1 голос
/ 05 августа 2010

Список имеет дело с 2500 символами. Это то, что медленно. Все эти данные, включая преобразование в / из массивов, хранятся в памяти. Следовательно, пропуск шага ToArray не имеет значения. Если ваши пользователи должны прокручивать горизонтально, чтобы увидеть эту информацию, скорее всего, вы застряли с «медленным».

Если нет, подумайте о рефакторинге. Стратегия: поместите только столько символов - около 100, сколько доступно для просмотра в обычном списке ширины. Полные строки остаются за кадром.

  • Создайте вспомогательный класс следующим образом (вы можете преобразовать открытую строку в свойство, если вы такой анальный; -):
    Class TruncatedListItem
        Public Content as string
        Overrides sub ToString() as string ' Pardon me if this is wrong I always use intellisense
            return Mid(Content,1,100)
        end sub
    end class
  • Добавьте эти элементы в список. Когда элемент в списке не имеет типа string, он вызывает метод ToString элемента (который мы только что создали, чтобы дать списку разрыв), и добавляет его в виде строки, тогда коллекция элементов отображается как элементы, которые вы ' мы добавили. (сохранить начало / конец обновления тоже)
    For each each itm as string in Items
        dim tli as new TruncatedListItem
        tli.Content = itm
        listbox.add(tli)
    next<pre></li>
    <li>When you want to see what the user picked, instead of getting the string like this:  
    
    <pre>MyString = Ctype(Listbox.SelectedItem,string)  
  • сделай это MyString = Ctype (ListBox.SelectedItem, TruncatedListItem). Содержание
  • Теперь я предполагаю, что пользователь в какой-то момент все еще нуждается в , чтобы увидеть все 2500 символов перед выбором. Если они не являются серьезной палкой в ​​грязи, они должны согласиться на эту альтернативу (на самом деле, у прокрутки есть свои преимущества).
    • Когда они дважды щелкают по элементу, в обработчике для двойного щелчка покажите им полный текст в окне сообщения. Вы можете сказать им, чтобы сделать это во всплывающей подсказке. Например, в обработчике двойного щелчка: msgbox Ctype (ListBox.SelectedItem, TruncatedListItem) .Content ,, "Полный текст элемента"

Удачи!

1 голос
/ 05 августа 2010

Одна вещь, которую вы можете попробовать, это изменить эту строку:

listBox1.Items.AddRange(items.ToArray());

на что-то вроде этого:

foreach (var item in items)
{
    listBox1.Items.Add(item);
}

Таким образом, у вас нет лишних затрат на создание совершенно новогомассив (вызов ToArray()) перед помещением элементов в ваш ListBox.

...