【问题标题】:Adding Data to existing DataTable's DataRow将数据添加到现有 DataTable 的 DataRow
【发布时间】:2011-06-15 05:08:27
【问题描述】:

我想将数据添加到 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 中。

有什么想法吗?也许对这种行为的解释?

【问题讨论】:

  • 与您的问题无关,但您可能应该将数据表包装在 using 语句中
  • 我需要更长的对象生命周期 - 因此我没有使用 using 语句。

标签: c# datatable datarow


【解决方案1】:

我不确定你为什么要经历这样的努力,可能有你自己的原因。
但是,语法不准确,您是否研究过...

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()

【讨论】:

  • Clone() 和 View->ToTable() 将进行复制。如果可能的话,我想避免这种情况。
猜你喜欢
  • 1970-01-01
  • 2017-01-30
  • 1970-01-01
  • 2012-05-03
  • 2010-11-22
  • 2012-11-25
  • 1970-01-01
  • 2015-09-16
  • 1970-01-01
相关资源
最近更新 更多