Более быстрое сравнение строк в C # - PullRequest
3 голосов
/ 24 марта 2012

У меня есть программа, которая сравнивает два файла. Я запустил визуальный студийный анализ и обнаружил, что мое время сравнения велико. Есть ли более быстрый способ сравнить две строки, чем эта? (Я не могу использовать параллельный foreach, потому что это может вызвать ошибки.) Сейчас я использую параллельный словарь, но я открыт для других опций. :)

var metapath = new ConcurrentDictionary<string, string>();
foreach(var me in metapath)
{
 if (line.StartsWith(me.Key.ToString()))
 {...}
}

Ответы [ 3 ]

5 голосов
/ 24 марта 2012

Прежде всего, удалите ToString() из me.Key.ToString().

Затем используйте сравнение порядковых строк (при условии, что это не влияет на корректность):

line.StartsWith(me.Key, StringComparison.Ordinal);

Это полезно, потому что стандартные сравнения строк следуют различным правилам Юникода на равных.Например, нормализованные и денормализованные последовательности должны рассматриваться как равные.Ordinal просто сравнивает необработанные символьные данные, игнорируя правила равенства Unicode.Подробнее об этом здесь , например, или здесь (который утверждает, что это быстрее, но без кавычек).

Последнее, профилируйте код.Вы будете удивлены, но в большинстве случаев медленная часть совсем не такая, как вы думаете.Например, это может быть часть, где вы добавляете что-то в словарь.

1 голос
/ 24 марта 2012

Если вы сравниваете строки точно, String.Equals достаточно хорош:

String.Equals(line, me.Key)

Вы видели это: Какое самое быстрое (встроенное) сравнение для строковых типов в C #

0 голосов
/ 24 марта 2012

Непонятно, что именно вы подразумеваете под «сравнением», но если вы не имеете в виду «сортировать», то есть вы хотите проверить на плагиат или что-то в этом роде, то как насчет хеширования строк и сравнения хеша?

В зависимости от размера вашего набора данных, будет ли какая-либо выгода. Большие и маленькие - это очень субъективные термины.

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