简体   繁体   English

向DataTable添加多行

[英]Adding multiple rows to DataTable

I know two ways to add new row with data to a DataTable 我知道有两种方法可以将新行与数据添加到DataTable

string[] arr2 = { "one", "two", "three" };
dtDeptDtl.Columns.Add("Dept_Cd");

for (int a = 0; a < arr2.Length; a++)
{
    DataRow dr2 = dtDeptDtl.NewRow();
    dr2["Dept_Cd"] = DeptCd[a];
    dtDeptDtl.Rows.Add(dr2);
}

for (int a = 0; a < arr2.Length; a++)
{
    dtDeptDtl.Rows.Add();
    dtDeptDtl.Rows[a]["Dept_Cd"] = DeptCd[a];
}

Both the above methods will give me the same result ie One Two Three will be added in DataTable in seperate rows. 以上两种方法会给我同样的结果,即一二三将被添加DataTable中单独列。

But my question is that what is the difference between both the steps and which one is better way performance wise? 但我的问题是,两个步骤之间有什么区别,哪个是更好的表现方式?

Some decompiler observations 一些反编译观察

In both scenarios, a different overload of the System.Data.DataRowCollection.Add method is being used. 在这两种情况下,都使用System.Data.DataRowCollection.Add方法的不同重载。

The first approach uses: 第一种方法使用:

public void Add(DataRow row)
{
    this.table.AddRow(row, -1);
}

The second approach will use: 第二种方法将使用:

public DataRow Add(params object[] values)
{
    int record = this.table.NewRecordFromArray(values);
    DataRow dataRow = this.table.NewRow(record);
    this.table.AddRow(dataRow, -1);
    return dataRow;
}

Now, take a look at this little beast: 现在,看看这个小野兽:

internal int NewRecordFromArray(object[] value)
{
    int count = this.columnCollection.Count;
    if (count < value.Length)
    {
        throw ExceptionBuilder.ValueArrayLength();
    }
    int num = this.recordManager.NewRecordBase();
    int result;
    try
    {
        for (int i = 0; i < value.Length; i++)
        {
            if (value[i] != null)
            {
                this.columnCollection[i][num] = value[i];
            }
            else
            {
                this.columnCollection[i].Init(num);
            }
        }
        for (int j = value.Length; j < count; j++)
        {
            this.columnCollection[j].Init(num);
        }
        result = num;
    }
    catch (Exception e)
    {
        if (ADP.IsCatchableOrSecurityExceptionType(e))
        {
            this.FreeRecord(ref num);
        }
        throw;
    }
    return result;
}

Especially, note the this.columnCollection[i][num] = value[i]; 特别要注意this.columnCollection[i][num] = value[i]; , which will call: ,将致电:

public DataColumn this[int index]
{
    get
    {
        DataColumn result;
        try
        {
            result = (DataColumn)this._list[index];
        }
        catch (ArgumentOutOfRangeException)
        {
            throw ExceptionBuilder.ColumnOutOfRange(index);
        }
        return result;
    }
}

Moving forward, we discover that actually _list is an ArrayList : _list ,我们发现_list实际上是一个ArrayList

private readonly ArrayList _list = new ArrayList();

Conclusion 结论

In order to summarize the above, if you are using dtDeptDtl.Rows.Add(); 为了总结上述内容,如果您使用的是dtDeptDtl.Rows.Add(); instead of dtDeptDtl.Rows.Add(dr2); 而不是dtDeptDtl.Rows.Add(dr2); , you will get a performance degradation which will increase exponentially, as the number of columns grows. 随着列数的增加,您将获得性能下降 ,并将呈指数级增长。 The responsible line for the degradation is call to the NewRecordFromArray method, which iterates over an ArrayList . 降级的负责行是调用NewRecordFromArray方法,该方法遍历ArrayList

Note: This can be easily tested if you add, let's say, 8 columns to the table and make some tests in a for looping 1000000 times. 注意:如果您向表中添加8列,并在for循环1000000次中进行一些测试,则可以轻松测试。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM