我有一个大文本文件(~100MB),我将它的行保存在字符串列表中.
我的Winform偶尔需要显示它的一部分,例如500,000行.
我的Winform偶尔需要显示它的一部分,例如500,000行.
我尝试过使用ListBox,RichTextBox和TextBox,但绘图需要花费太多时间.
例如,TextBox需要25秒才能显示500,000行,
而记事本会立即打开此大小的文本文件.
什么是最快的解决方案?
解决方法
为什么不打开文件流,只读前几行.您可以使用搜索,因为用户在文件中滚动并显示相应的行.关键是 – 将整个文件读入内存需要很长时间,所以不要这样做!
入门代码
以下是一个不完整的短代码片段,但至少应该让您入门:
// 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或类似列表控件根据需要加载项目的方法.当用户在控件内滚动时,控件将执行回调以基于索引检索项目.只有当您的数据符合以下条件时,这才是可行的解决方案:
>您必须(预先)知道您希望呈现的数据项的数量.如果你需要阅读整个文件来获得这个总数,它就不适合你!
>您必须能够根据该项目的索引检索特定数据项,而无需读取整个文件.
>您必须愿意以图标,小细节,详细信息或其他支持的格式呈现数据(或者愿意花费大量额外工作来编写自定义列表视图).
如果您不能满足这些标准,那么虚拟模式将不会特别有用.无论您是否可以执行这些操作,我提供的答案都将有效.当然,如果您可以满足这些最低标准,那么无论如何 – 查找列表视图的虚拟模式,您应该找到一些非常有用的信息!