1

我有一个大的 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秒。有什么简单的方法可以改善这一点吗?

4

3 回答 3

2

在填充数据之前,请在 DataTable 上调用 BeginLoadData() 方法。完成数据加载后,调用 EndLoadData()。这将关闭所有通知、索引维护和约束,从而提高性能。

作为替代方案,在更新每一行之前调用 BeginEdit(),并在该行的编辑完成时调用 EndEdit()。

Here is a link with more information on improving DataSet performance: http://www.softwire.com/blog/2011/08/04/dataset-performance-in-net-web-applications/

于 2015-11-19T18:35:54.480 回答
1

我能想到的一项改进是通过索引而不是名称来编辑列。

foreach (DataRow row in dt.Rows)
{
    for (int j = 0; j < 15; j++)
    {
        row[j] = 5;
    }
}

通过经验测试,您的方法在我的计算机上似乎在 ~1500 毫秒内运行,而这个基于索引的版本在 ~1100 毫秒内运行。

另外,请参阅 Marc 在这篇文章中的回答:

在没有 for 循环的情况下为数据表中的所有行设置值

于 2012-12-15T20:00:26.363 回答
0

这取决于您的业务逻辑,这在您的问题中并不清楚,但是,如果您想为每行中的某些列设置值,请尝试以下操作,

  • 创建一个单独的临时列,您可以在创建原始数据表时在同一个循环中创建它

  • 将新值填入此列,

  • 删除旧列并在其位置插入新列。

如果您可以期待新值,或者如果您对所有行都有相同的值(如在您的示例中),或者如果您有某种重复,那么这个解决方案将是合乎逻辑的,在这种情况下,添加一个加载的新列将会更多比循环所有行更快。

于 2012-12-15T20:04:12.527 回答