2010-08-05 27 views
0

我需要添加長度爲2500個字符的950個字符串到列表框。我在下面使用的方法需要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 2010-08-05 00:51:03

+0

@Eric:嗯......好的。您是否碰巧擁有Visual Studio 2010及其分析器,或者是否有權訪問另一個分析器,它可以告訴您哪些行最耗時? – 2010-08-05 00:55:29

+0

使用vs2010中包含的分析器看起來,所有的時間都花在「Add」或「AddRange」方法中。 – Eric 2010-08-05 01:13:47

1

列表框處理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
  • 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)。內容
  • 現在我assumming用戶,在某些時候,仍然需要在選擇前查看所有2500個字符。除非他們是一個嚴重的泥濘,他們應該爲這個替代方案而定(實際上滾動有其優點)。
    • 當他們雙擊一個項目時,在雙擊的處理程序中,將它們全文顯示在一個消息框中。你可以告訴他們在工具提示中這樣做。例如,在雙擊處理程序中:MsgBox CTYPE(ListBox.SelectedItem,TruncatedListItem)。內容,, 「全部項目文本」

祝你好運!

+0

我不在與.net上的Pc,因此如果它實際上並沒有加快速度,我們很抱歉。但我不明白它不會如何。如果我錯了,請盯住我的鼻子! – FastAl 2010-08-05 02:14:51