У меня есть две таблицы данных. DataTable dtRequired и DataTable dtResult.
Я хочу вывести таблицу данных, которая содержит строки, которых не было в dtResponse, но которые были найдены в dtRequired.
Подход 1
Мы использовали алгоритм, указанный по следующему адресу http://weblogs.sqlteam.com/davidm/archive/2004/01/19/739.aspx.
И этот алгоритм считается одним из самых медленных в нашем профилировании.
Подход 2
Итак, я попытался заменить вышеприведенный алгоритм чем-то, что описано ниже.
dtRequired индексируется в столбцах, которые я использую ниже, чтобы Найти строку.
if (dtResult.Rows.Count > 0)
{
lock (dtResult)
{
DataRow rowfound = null;
for (int i = 0; i < dtResult.Rows.Count; i++)
{
DataRow row = dtResult.Rows[i];
rowfound = dtRequired.Rows.Find(new object[] { row[0], row[1], row[2], row[3], row[4], row[5], row[6], row[7], row[8] });
if (rowfound != null)
{
dtRequired.Rows.Remove(rowfound);
}
}
}
}
Однако вышеприведенный фрагмент занимает больше времени, чем Подход 1 .
Подход 2 занимает ~ 3 секунды для dtResult с 1250 строками и dtRequired с 4500 строками.
Что-то не так с подходом, о котором я говорил выше? Есть ли лучший способ добиться этого?