加快列表框插入时间

时间:2010-08-05 00:44:48

标签: c# winforms .net-2.0 listbox

我需要将长度为2500个字符的950个字符串添加到列表框中。我在下面使用的方法需要2.5秒,理想情况下需要在500毫秒内完成。

Stopwatch sw = Stopwatch.StartNew();

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

sw.Stop();

优化插入时间的最佳方法是什么?

感谢。

2 个答案:

答案 0 :(得分:1)

你可以尝试的一件事是改变这一行:

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

这样的事情:

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

这样,在将项目放入ToArray()之前,您没有创建全新数组(ListBox调用)的开销。

答案 1 :(得分: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
  • 将这些项目添加到列表框中。当列表框中的项目不是字符串类型时,它会调用项目的ToString方法(嘿,我们只是为了给列表框一个中断而定制)并将其作为字符串添加,然后项目集合显示为您的项目我补充道。 (保持开始/结束更新)
    For each each itm as string in Items
        dim tli as new TruncatedListItem
        tli.Content = itm
        listbox.add(tli)
    next
  • 当您想要查看用户选择的内容时,而不是像这样获取字符串:
     
  • 这样做 MyString = Ctype(ListBox.SelectedItem,TruncatedListItem).Content
  • 现在我正在假设用户,在某些时候仍然需要在选择之前查看所有2500个字符。除非他们是一个严肃的坚持,他们应该满足于这种选择(实际上滚动有利)。
    • 当他们双击某个项目时,在双击处理程序中,在消息框中显示全文。您可以告诉他们在工具提示中执行此操作。例如,在双击处理程序中:msgbox Ctype(ListBox.SelectedItem,TruncatedListItem).Content ,,“Full Item Text”
祝你好运!