Добавление данных в существующую DataRable DataRow - PullRequest
2 голосов
/ 25 января 2011

Я хочу добавить данные в уже существующий 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 после записи туда.

Есть идеи? А может объяснения этому поведению?

1 Ответ

0 голосов
/ 25 января 2011

Я не уверен, почему вы предпринимаете такие усилия, и, возможно, у вас есть свои причины.
Однако не точный синтаксис, вы рассматривали такие вещи, как ...

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