在谈论我的问题之前,我想澄清一下这不是一个询问如何 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);
}
答案 0 :(得分:4)
您看到的长时间运行问题可能是由于c#运行时如何处理String。因为Strings是不可变的,所以每当你在它们上面调用+时它会将String复制到目前为止,然后将下一个小部分复制到一个新的内存位置然后返回它。
Eric Lippert在这里发表了很多文章:Part 1和Part 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);
}