你可以嘗試以下 - 它給了我一個性能提升,雖然你的里程可能會有所不同!我已經將它適用於您的示例,以演示如何使用備用機制來複制數據表 - 克隆表,然後流式傳輸數據。您可以輕鬆將其放入擴展方法中。
List<DataTable> aCopy = new List<DataTable>();
for(int i = 0; i < a.Rows.Count; i++) {
DataTable sourceTable = a[i];
DataTable copyTable = sourceTable.Clone(); //Clones structure
copyTable.Load(sourceTable.CreateDataReader());
}
這是許多倍以下的速度(約6在我的用例):
DataTable copyTable = sourceTable.Clone();
foreach(DataRow dr in sourceTable.Rows)
{
copyTable.ImportRow(dr);
}
而且,如果我們看一下DataTable.Copy使用ILSpy做:
public DataTable Copy()
{
IntPtr intPtr;
Bid.ScopeEnter(out intPtr, "<ds.DataTable.Copy|API> %d#\n", this.ObjectID);
DataTable result;
try
{
DataTable dataTable = this.Clone();
foreach (DataRow row in this.Rows)
{
this.CopyRow(dataTable, row);
}
result = dataTable;
}
finally
{
Bid.ScopeLeave(ref intPtr);
}
return result;
}
internal void CopyRow(DataTable table, DataRow row)
{
int num = -1;
int newRecord = -1;
if (row == null)
{
return;
}
if (row.oldRecord != -1)
{
num = table.recordManager.ImportRecord(row.Table, row.oldRecord);
}
if (row.newRecord != -1)
{
if (row.newRecord != row.oldRecord)
{
newRecord = table.recordManager.ImportRecord(row.Table, row.newRecord);
}
else
{
newRecord = num;
}
}
DataRow dataRow = table.AddRecords(num, newRecord);
if (row.HasErrors)
{
dataRow.RowError = row.RowError;
DataColumn[] columnsInError = row.GetColumnsInError();
for (int i = 0; i < columnsInError.Length; i++)
{
DataColumn column = dataRow.Table.Columns[columnsInError[i].ColumnName];
dataRow.SetColumnError(column, row.GetColumnError(columnsInError[i]));
}
}
}
操作需要很長時間並不奇怪,它不僅是逐行的,而且還有額外的驗證。
如何「大」是數據表的名單? – 2011-12-28 16:25:42
我不認爲你可以加快速度,同時仍然在處理這些要求。 (也就是說它是一個深層拷貝。)另外請注意,在你的代碼的RELEASE版本中,性能會比你的代碼的DEBUG版本更好。 – Dracorat 2011-12-28 16:30:00