Сообщение Re[3]: DataTable.Select vs List<T>.Any vs LINQ To DataTable от 04.05.2016 15:42
Изменено 04.05.2016 15:51 Lexey
Здравствуйте, Berill, Вы писали:
B>Мои замеры показали, что код
B>
B>ничуть не шустрее Select'a =(
Зачем делать полную выборку и потом преобразовывать ее в List только ради того, чтобы сравнить Count с нулем?
Тем более, что дальше идет правильный вариант с Any.
B>Мои замеры показали, что код
B>
private static void GetFindResultsForTableWithCast(int count, DataTable table)
B> {
B> Measure("Table Cast",
B> () =>
B> {
B> for ( int i = 0; i < count; i++ )
B> {
B> var allRows = table.Rows.Cast<DataRow>();
B> var found = allRows.Where(r => (int)r["TypeCode"] == 10
B> && (string)r["Period"] == "01.01.2016"
B> && (int)r["DetailID"] == 5)
B> .ToList()
B> .Count != 0;
B> }
B> return count;
B> });
B> }
B>ничуть не шустрее Select'a =(
Зачем делать полную выборку и потом преобразовывать ее в List только ради того, чтобы сравнить Count с нулем?
Тем более, что дальше идет правильный вариант с Any.
Re[3]: DataTable.Select vs List<T>.Any vs LINQ To DataTable
Здравствуйте, Berill, Вы писали:
B>У меня нет никаких ключей и индексы для таблицы я сам не создаю (пока что).
B>В основном идет поиск по трем полям (мне не нужны сами эти записи, мне нужен факт их наличия или отсутствия)
HashSet<ValueTuple<fieldT1,fieldT2,fieldT3>> в помощь. Один раз заполняешь данными из таблицы, потом делаешь проверки за околоконстантное время.
B>, а B>также еще один часто используемый цикл по этой таблице — нахождение максимального значения поля Code для TYPE_CODE B>== addingRowInfo.TypeCode.
Если это разовое действие (а оно разовое, если набор строк не меняется), то проще все одним сканом по таблице типа:
table.Rows.Cast<DataRow>().Where(_ => (int)_["TypeCode"] == addingRowInfo.TypeCode).Select(_ => (int)_["Code]).Max();
Можно еще ординалы для колонок заранее получить и использовать вместо имен, чтобы еще чуток ускорить.
B>Мои замеры показали, что код
B>
B>ничуть не шустрее Select'a =(
Зачем делать полную выборку и потом преобразовывать ее в List только ради того, чтобы сравнить Count с нулем?
Тем более, что дальше идет правильный вариант с Any.
B>У меня нет никаких ключей и индексы для таблицы я сам не создаю (пока что).
B>В основном идет поиск по трем полям (мне не нужны сами эти записи, мне нужен факт их наличия или отсутствия)
HashSet<ValueTuple<fieldT1,fieldT2,fieldT3>> в помощь. Один раз заполняешь данными из таблицы, потом делаешь проверки за околоконстантное время.
B>, а B>также еще один часто используемый цикл по этой таблице — нахождение максимального значения поля Code для TYPE_CODE B>== addingRowInfo.TypeCode.
Если это разовое действие (а оно разовое, если набор строк не меняется), то проще все одним сканом по таблице типа:
table.Rows.Cast<DataRow>().Where(_ => (int)_["TypeCode"] == addingRowInfo.TypeCode).Select(_ => (int)_["Code]).Max();
Можно еще ординалы для колонок заранее получить и использовать вместо имен, чтобы еще чуток ускорить.
B>Мои замеры показали, что код
B>
private static void GetFindResultsForTableWithCast(int count, DataTable table)
B> {
B> Measure("Table Cast",
B> () =>
B> {
B> for ( int i = 0; i < count; i++ )
B> {
B> var allRows = table.Rows.Cast<DataRow>();
B> var found = allRows.Where(r => (int)r["TypeCode"] == 10
B> && (string)r["Period"] == "01.01.2016"
B> && (int)r["DetailID"] == 5)
B> .ToList()
B> .Count != 0;
B> }
B> return count;
B> });
B> }
B>ничуть не шустрее Select'a =(
Зачем делать полную выборку и потом преобразовывать ее в List только ради того, чтобы сравнить Count с нулем?
Тем более, что дальше идет правильный вариант с Any.