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