Оптимизация поиска двумерного массива с помощью LINQ - PullRequest
3 голосов
/ 26 ноября 2009

У меня есть двумерный массив объектов (преимущественно, но не исключительно строк), которые я хочу отфильтровать по строке (sSearch) с помощью LINQ. Следующий запрос работает, но не так быстро, как хотелось бы.

Я изменил Count на Any, что привело к значительному увеличению скорости и заменил Contains регулярным выражением, которое игнорирует регистр, тем самым исключив вызов ToLower. В совокупности это более чем вдвое сократило время выполнения.

Что сейчас очень заметно, так это то, что увеличение длины поискового термина с 1 до 2 букв утраивает время выполнения, а есть еще один переход с 3 до 4 букв (увеличение времени выполнения на ~ 50%). Хотя это, очевидно, не удивительно, мне интересно, можно ли что-то еще сделать для оптимизации сопоставления строк?

Regex rSearch = new Regex(sSearch, RegexOptions.IgnoreCase);
rawData.Where(row => row.Any(column => rSearch.IsMatch(column.ToString())));

В этом случае набор данных имеет около 10 тыс. Строк и 50 столбцов, но его размер может значительно отличаться.

Буду очень признателен за любые предложения по оптимизации этого вопроса.

1 Ответ

5 голосов
/ 26 ноября 2009

Одна оптимизация заключается в использовании Any вместо Count - таким образом, как только будет найден один соответствующий столбец, строка может быть возвращена.

rawData.Where(row => row.Any(column => column.ToString()
                                             .ToLower().Contains(sSearch)))

Вы также должны знать, что ToLower является чувствительным к культуре. Если не может быть проблемой в вашем случае, но это стоит знать. ToLowerInvariant может быть лучшим вариантом для вас. Жаль, что для Contains нет перегрузки, которая позволяет указать, что вы хотите, чтобы регистр не учитывался без учета регистра ...

РЕДАКТИРОВАТЬ: Вы используете регулярное выражение сейчас - вы пробовали RegexOptions.Compiled? Это может или не может помочь ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...