【发布时间】:2013-12-21 18:12:02
【问题描述】:
我有一个 C# 程序正在拉入一个大约 .csv 文件。 42,000 行长。文件中所有数据的存储方式如下:
Zipcode,City,State
我将所有信息提取到listview 中的三个不同列中。
目前,这些数据需要大约 30 - 50 秒才能进入我的程序。我的问题是如何更好地优化我的代码以缩短这段时间?
以下是我的代码的 sn-p。注释代码是我之前尝试过的代码,但没有成功减少时间,因此我以更易于阅读的方式重写了它。
//These are globally declared.
lvZip.Columns.Add("Zipcode", 150, HorizontalAlignment.Left);
lvZip.Columns.Add("City", 150, HorizontalAlignment.Left);
lvZip.Columns.Add("State", 150, HorizontalAlignment.Left);
lvZip.View = View.Details;
lvZip.Items.Clear();
//string dir = System.IO.Path.GetDirectoryName(
// System.Reflection.Assembly.GetExecutingAssembly().Location);
//string path = dir + @"\zip_code_database_edited.csv";
//var open = new StreamReader(File.OpenRead(path));
//foreach (String s in File.ReadAllLines(path))
//{
// Zipinfo = s.Split(',');
// Zipinfo[0] = Zipinfo[0].Trim();
// Zipinfo[1] = Zipinfo[1].Trim();
// Zipinfo[2] = Zipinfo[2].Trim();
// lvItem = new ListViewItem(Zipinfo);
// lvZip.Items.Add(lvItem);
//}
//open.Close();
StreamReader myreader = File.OpenText(path);
aLine = myreader.ReadLine();
while (aLine != null)
{
Zipinfo = aLine.Split(',');
Zipinfo[0] = Zipinfo[0].Trim();
Zipinfo[1] = Zipinfo[1].Trim();
Zipinfo[2] = Zipinfo[2].Trim();
lvItem = new ListViewItem(Zipinfo);
lvZip.Items.Add(lvItem);
aLine = myreader.ReadLine();
}
myreader.Close();
【问题讨论】:
-
到目前为止的 3 个答案都很好。您可能想尝试 ListView 属性 DoubleBuffered,但如果已经使用 BeginUpdate+EndUpdate,它可能不会有什么不同。如果您认为这种方法值得付出额外努力,您可以使用 VirtualMode 使 ListView 非常 快(例如,在 1 秒内仅加载 1 个“页面”数据)。
-
使用
BeginUpdate()和EndUpdate()将提供更多可见 性能提升。但是 Tweety 建议的AddRange()方法将进一步优化您的代码。尽管性能提升可能不像AddRange()那样显着 -TextFieldParser类是专门为处理结构化文本文件(如 CSV)而设计的。
标签: c# listview io streamreader streamwriter