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

前端之家收集整理的这篇文章主要介绍了用C#winforms绘制大文本文件的最快方法前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个大文本文件(~100MB),我将它的行保存在字符串列表中.
我的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或类似列表控件根据需要加载项目的方法.当用户在控件内滚动时,控件将执行回调以基于索引检索项目.只有当您的数据符合以下条件时,这才是可行的解决方案:

>您必须(预先)知道您希望呈现的数据项的数量.如果你需要阅读整个文件来获得这个总数,它就不适合你!
>您必须能够根据该项目的索引检索特定数据项,而无需读取整个文件.
>您必须愿意以图标,小细节,详细信息或其他支持的格式呈现数据(或者愿意花费大量额外工作来编写自定义列表视图).

如果您不能满足这些标准,那么虚拟模式将不会特别有用.无论您是否可以执行这些操作,我提供的答案都将有效.当然,如果您可以满足这些最低标准,那么无论如何 – 查找列表视图的虚拟模式,您应该找到一些非常有用的信息!

猜你在找的C&C++相关文章