2010-08-05 3 views
0

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

Stopwatch sw = Stopwatch.StartNew(); 

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

sw.Stop(); 

Что было бы лучшим способом для оптимизации времени вставки?

Спасибо.

ответ

1

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

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

к чему-то вроде этого:

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

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

+0

Спасибо за предложение. К сожалению, это занимает столько же времени, сколько и метод addrange. – Eric

+0

@ Эрик: Хм ... хорошо. Есть ли у вас Visual Studio 2010 и ее профилировщик или у вас есть доступ к другому профилировщику, который мог бы рассказать вам, где больше всего времени тратится на эти линии? –

+0

Использование профайлера, включенного в vs2010, кажется, что все время расходуется на методы 'Add' или' AddRange'. – Eric

1

Listbox имеет дело с 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
  • Добавить эти элементы в ListBox. Когда элемент в списке не имеет строку типа, он вызывает метод ToString элемента (который, кстати, мы просто адаптируем для того, чтобы дать переименованию списка) и добавляет его как строку, то коллекция предметов появляется как элементы, добавил. (Держать начала/конца обновления тоже)
    For each each itm as string in Items 
        dim tli as new TruncatedListItem 
        tli.Content = itm 
        listbox.add(tli) 
    next
  • When you want to see what the user picked, instead of getting the string like this:
    MyString = Ctype(Listbox.SelectedItem,string)
  • сделать это MyString = CTYPE (ListBox.SelectedItem, TruncatedListItem) .content
  • Теперь я assumming пользователю, в какой-то момент, по-прежнему потребности в перед выбором выберите все 2500 символов. Если они не являются серьезной палочкой в ​​грязи, они должны решить эту альтернативу (на самом деле есть преимущества для прокрутки).
    • Когда они дважды кликают элемент, в обработчике для двойного щелчка, покажите им полный текст в окне сообщений. Вы могли бы сказать им сделать это в подсказке. Например, в обработчике двойного щелчка: MsgBox CTYPE (ListBox.SelectedItem, TruncatedListItem) .content ,, "Полный текст" Item

Удачи!

+0

Я не на ПК с .net на этом, так что извиняюсь, если он на самом деле не ускоряет работу. Но я не вижу, как это не будет. Надевайся на меня, если я ошибаюсь! – FastAl