Добавление нескольких строк в 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];
}

оба вышеуказанных метода дадут мне тот же результат i.e один два три будет добавлен в DataTable в отдельных строках.

но мой вопрос в том, в чем разница между обоими шагами, и какой из них лучше всего работает?

1 ответов


некоторые наблюдения декомпилятора

в обоих сценариях разная перегрузка System.Data.DataRowCollection.Add метод используется.

первый подход использует:

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

второй подход будет использовать:

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;
}

теперь, взгляните на это маленькое чудовище:

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;
}

особенно обратите внимание на this.columnCollection[i][num] = value[i];, который звонок:

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

продвигаемся вперед, мы обнаруживаем, что на самом деле _list - это ArrayList:

private readonly ArrayList _list = new ArrayList();

вывод

чтобы суммировать вышесказанное, если вы используете dtDeptDtl.Rows.Add(); вместо dtDeptDtl.Rows.Add(dr2); вы получите:деградация производительности который будет увеличиваться экспоненциально, так как количество столбцов растет. Ответственной линией за деградацию является вызов NewRecordFromArray метод, который проходит через ArrayList.

Примечание: это можно легко проверить, если вы добавите, скажем, 8 столбцов в таблица и сделать некоторые тесты в for цикл 1000000 раз.