在讨论我的问题之前,我想澄清一下,这不是问如何打开大型文本文件的问题。

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

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

所以问题是,显示大量字符的更好的UI组件是什么(我在dictionary对象中有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);
        }

最佳答案

您看到的长期运行的问题可能是由于c#运行时如何处理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);
}

09-19 10:49