Повышение эффективности сравнения нескольких строк (регулярное выражение?) - PullRequest
2 голосов
/ 23 января 2011

У меня есть следующий код, который я пытаюсь ускорить:

private bool IsValidProduct(string productName)
        {
            return (productName.IndexOf("something", StringComparison.InvariantCultureIgnoreCase) == -1 &&
                    productName.IndexOf("whatever", StringComparison.InvariantCultureIgnoreCase) == -1 &&
                    productName.IndexOf("blah", StringComparison.InvariantCultureIgnoreCase) == -1 &&
                    productName.IndexOf("keyword", StringComparison.InvariantCultureIgnoreCase) == -1 &&
                    productName.IndexOf("etc...", StringComparison.InvariantCultureIgnoreCase) == -1);
        }

Есть около десятка слов, которые я проверяю в настоящее время.

Какой самый быстрый способ сделать это?

Ответы [ 4 ]

5 голосов
/ 23 января 2011

Regex не очень хорошая идея, попробуйте что-то вроде этого:

List<string> keywords = new List<string>
    {
        "something",
        "whatever",
        "keyword",
        "etc"
    };

return keywords.All(keyword => !productName.Contains(keyword));
2 голосов
/ 23 января 2011

Есть около десятка слов, которые я проверяю в настоящее время.

Я думаю, это означает, что у вас нет проблем с производительностью.

Но решение для регулярных выражений будет выглядеть так:

var r = new Regex("something|whatever|blah", RegexOptions.IgnoreCase);
return ! r.ismatch(productName);

Что, по крайней мере, так читабельно, на мой взгляд. И я уверен, что это быстрее, но вам придется профилировать.

Для повышения производительности вам придется кэшировать и повторно использовать экземпляр RegEx. Создание это дорогая часть.

2 голосов
/ 23 января 2011

Вы можете преобразовать productName в нижний регистр, а затем использовать .Contains.Должно быть немного быстрее.Поскольку вы используете инвариантную культуру, это должно работать (в некоторых культурах это не так).

string lowerProductName=productName.ToLowerInvariant();
return !(lowerProductName.Contains("1")||
         lowerProductName.Contains("2"));

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

Но я согласен с Коди в том, что вы должны сначала зарегистрироваться и выяснить, действительно ли этот код замедляет вас.

0 голосов
/ 23 января 2011

Как насчет использования реализации Рабина-Карпа , которая предназначена для поиска набора ключевых слов в целевом тексте?

Или что Бойер-Мур Что является золотым стандартом для быстрого поиска строки, но будет искать только одну строку за раз?

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