簡體   English   中英

用C#winforms繪制大文本文件的最快方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM