2009-11-26 2 views
3

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

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

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

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

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

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

+0

Они * говорят * Сравнение с верхним числом оптимизировано ... – Dykam

+0

Не могли бы вы рассказать нам больше о вашей проблеме (характер ваших данных, образец в sSearch ...)? Я думаю, что у нас слишком мало элементов, чтобы углубиться в оптимизацию ... – Roubachof

ответ

5

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

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

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

EDIT: Вы используете регулярное выражение сейчас - вы пробовали RegexOptions.Compiled? Он может или не может помочь ...

+0

Отличный ответ, который почти наполовину сократил время выполнения. Я знал, что должно быть что-то лучше, чем граф. Любые другие идеи по оптимизации обновленного решения были бы замечательными. –

+0

Я пробовал RegexOptions.Compiled и не имел заметного эффекта. –

+0

@Nikolas: Достаточно справедливо. Это одна из тех вещей, которые иногда помогают, а иногда и нет. –

Смежные вопросы