[英]Fastest way to draw a large text file in C# winforms
我有一個大文本文件(~100MB),我將它的行保存在字符串列表中。 我的Winform偶爾需要顯示它的一部分,例如500,000行。
我嘗試使用ListBox,RichTextBox和TextBox,但繪圖花費了太多時間。
例如,TextBox需要25秒才能顯示500,000行,而記事本會立即打開此大小的文本文件。
什么是最快的解決方案?
為什么不打開文件流,只讀前幾行。 您可以使用seek
因為用戶在文件中滾動並顯示相應的行。 關鍵是 - 將整個文件讀入內存需要很長時間,所以不要這樣做!
入門代碼
以下是一個不完整的簡短代碼片段,但至少應該讓您入門:
// estimate the average line length in bytes somehow:
int averageLineLengthBytes = 100;
// also need to store the current scroll location in "lines"
int currentScroll = 0;
using (var binaryReader = new StreamReader(new FileStream(fileName, FileAccess.Read)))
{
if (binaryReader.BaseStream.CanSeek)
{
// seek the location to read:
binaryReader.BaseStream.Seek(averageLineLengthBytes * currentScroll, SeekOrigin.Begin);
// read the next few lines using this command
binaryReader.ReadLine();
}
else
{
// revert to a slower implementation here!
}
}
最大的訣竅是估計滾動條需要多長時間(文件中有多少行)。 為此,您將不得不在用戶滾動時更改滾動條, 或者您可以使用此文件中典型行的長度的先驗知識,並基於總字節數估計長度。 無論哪種方式,希望這有幫助!
關於虛擬模式的注意事項
虛擬模式是一種使用ListBox
或類似列表控件根據需要加載項目的方法。 當用戶在控件內滾動時,控件將執行回調以基於索引檢索項目。 只有當您的數據符合以下條件時,這才是可行的解決方案:
如果您不能滿足這些標准,那么虛擬模式將不會特別有用。 我提出的答案seek
不管你是否能執行這些操作會工作。 當然,如果你能滿足這些最低標准,那么無論如何 - 查看列表視圖的虛擬模式,你應該找到一些非常有用的信息!
ListView具有虛擬模式屬性。 它允許您僅使用Retrieve Virtual Item Event加載視圖中的數據。 因此,當該事件觸發項目編號40,000時,您將對該行中讀取的文件執行搜索。
您還可以在Microsoft上找到虛擬列表框的示例 。 它真的很舊,但它給你一個基本的想法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.