2011-01-25 74 views
2

我想将数据添加到DataTable中已存在的DataRow。 这个想法是,不要复制已经存在的数据。将数据添加到现有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

不是真的跟你的问题,但你或许应该换行的数据表中using语句 – Manatherin 2011-01-25 13:46:56

+0

我需要的对象的寿命更长 - 因此我没有在那里使用使用语句。 – StampedeXV 2011-01-27 07:46:07

回答

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() 
相关问题