1

如果您有一个包含许多条目的大文本文件怎么办,您必须获取这些条目并将它们保存到 List 有没有比我的代码中的传统方式更快的方法来做到这一点

    /// <summary>
    /// Reads Data from the given path
    /// </summary>
    /// <param name="path">Path of the File to read</param>
    public void Read(string path)
    {
        try
        {
            FileStream file = new FileStream(path, FileMode.Open);
            StreamReader reader = new StreamReader(file);
            string line;

            while ((line = reader.ReadLine()) != null)
            {                
                myList.Add(line);
                System.Windows.Forms.Application.DoEvents();
            }
            reader.Close();
            file.Close();
        }
        catch (Exception c)
        {
            MessageBox.Show(c.Message);
        }

    }
4

3 回答 3

6

更快 - 可能不会,但更短?是的:

myList.AddRange(File.ReadAllLines(path));

此外,如果这是一个非常大的文件,您不应该在 UI 线程中进行加载,只需使用后台工作程序 - 这将使您免于调用Application.DoEvents()每一行,并且可能会使这比您原来的方法快一些 - 尽管比较与文件 I/O 的成本相比,节省的成本将是最小的,但您将拥有更简洁的代码。

于 2011-03-30T00:02:31.677 回答
4

通常我会发表评论,但在这种情况下它实际上是一个答案。

不,没有。读取文件的速度不会比……读取它快!

读取文件是线性时间,放下手。

现在,如果您知道有关文件的一些信息,比如说...您想跳过一些标题信息,您可以通过向前跳过来做到这一点。但是,如果文件中的位置取决于先前的数据(不是固定宽度),或者您需要其中的每一行,那么它不会比这更快。

于 2011-03-29T23:59:44.703 回答
1

你将不得不摆脱 DoEvents()。试试看:在它忙于读取文件时关闭表单。请注意,您的程序不会停止。很有可能它会在读取完成后崩溃并死掉。

这也应该加快文件读取速度。为了防止 UI 冻结,您应该使用 BackgroundWorker。请务必阅读 MSDN 库文章以了解他们的正确性。

Making it faster still is going to require hardware. Start by questioning why you have to read such large text files, the info in that file probably belongs in a database.

于 2011-03-30T00:42:18.680 回答