我想将数据添加到DataTable中已存在的DataRow。 这样做的目的是在不复制已存在的数据的情况下这样做。
在编写一些测试时,我发现直接插入数据比将现有数据和新数据复制到新行并添加该行要慢得多。
或者我做错了吗?
首先,我使用初始数据创建一个DataTable。
填写初始数据:
DataTable table1 = new DataTable();
int count = 15;
for (int i = 0; i < count; i++)
{
table1.Columns.Add("hallo" + i, i % 2 == 0 ? typeof(int) : typeof(string));
}
int newStartIndex = table1.Columns.Count;
DateTime pre = DateTime.Now;
for (int i = 0; i < 100000; i++)
{
DataRow row = table1.NewRow();
for (int j = 0; j < table1.Columns.Count; j++)
{
if (j % 2 == 0)
{
row[j] = 502;
}
else
{
row[j] = "test";
}
}
table1.Rows.Add(row);
}
之后我又添加了15列和数据。
for (int i = count; i < 2 * count; i++)
{
table1.Columns.Add("hallo" + i, i % 2 == 0 ? typeof(int) : typeof(string));
}
foreach( DataRow row in table1.Rows)
{
for (int j = newStartIndex; j < table1.Columns.Count; j++)
{
if (j % 2 == 0)
{
row[j] = 502;
}
else
{
row[j] = "test";
}
}
}
当花时间时,它表明插入数据(应该与最初添加的数据完全相同)大约是初始填充的10倍。
现在我尝试复制数据:
List<object[]> toAdd = new List<object[]>();
foreach (DataRow row in table1.Rows)
{
object[] newArray = new object[table1.Columns.Count];
Array.Copy(row.ItemArray, newArray, count);
for (int j = newStartIndex; j < table1.Columns.Count; j++)
{
if (j % 2 == 0)
{
newArray[j] = 502;
}
else
{
newArray[j] = "test";
}
}
toAdd.Add(newArray);
}
table1.Rows.Clear();
foreach( var o in toAdd)
{
table1.Rows.Add(o);
}
这大约是初始填充的2.5倍,这比直接插入要快得多。
不知何故,我认为必须有一种更快的方式来添加数据,而不是复制所有内容并重新添加。
我尝试写入DataRow.ItemArray,但写完后不会在DataTable中出现这些更改。
有什么想法吗?也许解释这种行为?
答案 0 :(得分:0)
我不确定你为什么要经历这样的努力,并且可能有你自己的理由 然而,不是确切的语法,你有没有看到像......
这样的东西DataTable.Clone() // to make a copy
DataTable.Merge() // to merge one datatable all rows (w/Matching columns) into another
DataView oDV = YourDataTable.DefaultView
oDV.Filter = ...
DataTable newTable = oDV.ToTable()