我有一个大的DataTable - 大约15000行和100列 - 我需要为每一行中的某些列设置值。
// Creating the DataTable
DataTable dt = new DataTable();
for (int i = 0; i < COLS_NUM; i++)
{
dt.Columns.Add("COL" + i);
}
for (int i = 0; i < ROWS_NUM; i++)
{
dt.Rows.Add(dt.NewRow());
}
// Setting several values in every row
Stopwatch sw2 = new Stopwatch();
sw2.Start();
foreach (DataRow row in dt.Rows)
{
for (int j = 0; j < 15; j++)
{
row["Col" + j] = 5;
}
}
sw2.Stop();
上述测量时间约为4.5秒。有没有简单的方法可以改善这个?
答案 0 :(得分:2)
在填充数据之前,请调用DataTable上的BeginLoadData()方法。完成加载数据后,调用EndLoadData()。这将关闭所有通知,索引维护和约束,这将提高性能。
作为替代方案,在更新每一行之前调用BeginEdit(),并在完成该行的编辑时调用EndEdit()。
这是一个链接,其中包含有关提高DataSet性能的更多信息: http://www.softwire.com/blog/2011/08/04/dataset-performance-in-net-web-applications/
答案 1 :(得分:1)
我能想到的一个改进是按索引编辑列,而不是名称。
foreach (DataRow row in dt.Rows)
{
for (int j = 0; j < 15; j++)
{
row[j] = 5;
}
}
通过实证测试,您的方法似乎在我的计算机上运行~1500毫秒,而这个基于索引的版本运行在~1100毫秒。
另外,请参阅Marc在这篇文章中的回答:
答案 2 :(得分:0)
这取决于您的业务逻辑,但在您的问题中并不清楚,但是,如果要为每行中的某些列设置值,请尝试以下操作,
创建一个单独的临时列,您可以在同一个列中创建它 创建原始数据表时循环
将新值填入此列
删除旧列并将其替换为新列。
如果您可以期望新值或者如果您对所有行具有相同的值(如您的示例中)或者如果您有某种重复,则此解决方案将是合乎逻辑的,在这种情况下,添加带有加载的新列比循环所有行要快得多。