Информация об изменениях

Сообщение 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>
        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>
        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.