如何快速地将(非打开)非常大的文件呈现到UI组件(TextBox)中

时间:2013-07-12 02:19:06

标签: c# .net wpf

在谈论我的问题之前,我想澄清一下这不是一个询问如何 OPEN 大文本文件的问题。

我做到了。这是一个150MB的.txt文件,我把它转换成字典对象大约1秒钟。 在此之后,我想将它显示在UI组件中。

我曾尝试使用TextBox,但直到现在应用程序窗口还没有显示出来(点击F5后已经有5分钟了......)

所以问题是什么是显示大量字符的更好的UI组件(我在字典对象中有393300个元素)

由于

更新

 private void LoadTermCodes(TextBox tb)
        {
            Stopwatch sw = new Stopwatch();
            sw.Start();
            StreamReader sr = new StreamReader(@"xxx.txt");
            string line;
            while ((line = sr.ReadLine()) != null)
            {
                string[] colums = line.Split('\t');
                var id = colums[4];
                var diagnosisName = colums[7];

                if (dic.Keys.Contains(id))
                {
                    var temp = dic[id];
                    temp += "," + diagnosisName;
                    dic[id] = temp;
                }
                else
                {
                    dic.Add(id, diagnosisName);
                }

                //tb.Text += line + Environment.NewLine;
            }

            sw.Stop();
            long spentTime = sw.ElapsedMilliseconds;

            foreach (var element in dic)
            {
                tb.Text += element.Key + "\t" + element.Value + Environment.NewLine;
            }

            //tb.Text = "Eplased time (ms) = " + spentTime;
            MessageBox.Show("Jie shu le haha~~~ " + spentTime);
        }

1 个答案:

答案 0 :(得分:4)

您看到的长时间运行问题可能是由于c#运行时如何处理String。因为Strings是不可变的,所以每当你在它们上面调用+时它会将String复制到目前为止,然后将下一个小部分复制到一个新的内存位置然后返回它。

Eric Lippert在这里发表了很多文章:Part 1Part 2在幕后解释它。

相反,要停止所有这些复制,您应该使用StringBuilder。这将对您的代码做什么:

private void LoadTermCodes(TextBox tb)
{
    Stopwatch sw = new Stopwatch();
    sw.Start();
    StreamReader sr = new StreamReader(@"xxx.txt");
    string line;

    // initialise the StringBuilder
    System.Text.StringBuilder outputBuilder = new System.Text.StringBuilder(String.Empty);
    while ((line = sr.ReadLine()) != null)
    {
        string[] colums = line.Split('\t');
        var id = colums[4];
        var diagnosisName = colums[7];

        if (dic.Keys.Contains(id))
        {
            var temp = dic[id];
            temp += "," + diagnosisName;
            dic[id] = temp;
        }
        else
        {
            dic.Add(id, diagnosisName);
        }
    }

    sw.Stop();
    long spentTime = sw.ElapsedMilliseconds;

    foreach (var element in dic)
    {
        // append a line to it, this will stop a lot of the copying
        outputBuilder.AppendLine(String.Format("{0}\t{1}", element.Key, element.Value));
    }

    // emit the text
    tb.Text += outputBuilder.ToString();

    MessageBox.Show("Jie shu le haha~~~ " + spentTime);
}