Какой класс я должен использовать для выполнения многих замен в строке? - PullRequest
2 голосов
/ 14 января 2011

Я должен сделать много текстовых замен. Какой класс лучше всего использовать для эффективной работы? Это StringBuilder?

StringBuilder stringBuilder=new StringBuilder(startString);
stringBuilder.Replace(literala1,literala2);
stringBuilder.Replace(literalb1,literalb2);
stringBuilder.Replace(literalc1,literalc2);
...

или есть лучший класс для этого? Кстати, литералы будут в основном постоянными.

Ответы [ 4 ]

3 голосов
/ 14 января 2011

Этот точный вопрос был подробно рассмотрен в блоге Роберто Фары: Сравнение RegEx.Replace, String.Replace и StringBuilder.Replace - Какая производительность лучше?

Я кратко изложу здесь результаты, которые шокируют многих разработчиков .NET.Оказывается, что для относительно простой замены строки (в случаях, когда совпадения не нужны для учета регистра), RegEx.Replace() имеет худшую производительность, а String.Replace() выигрывает сbest.

Также предоставлена ​​ссылка на статью о CodeProject, которая подтверждает эти выводы: Операции StringBuilder и String / Fast String с .NET 2.0

В общем, ясказал бы, что правила должны быть следующими:

  • Используйте String.Replace(), когда вам нужно сделать только небольшое количество замен (скажем, около 5)
  • Используйте StringBuilder.Replace(), когдаВы должны сделать большее количество замен
  • Зарезервируйте регулярные выражения (RegEx.Replace) только для самых сложных сценариев, где стоит заплатить небольшой штраф за производительность за элегантность одного выражения, которое обрабатывает все необходимыезамены.
  • Игнорируйте все вышеперечисленные рекомендации и используйте все, что делает ваш код наиболее читабельным или выразительным.Преждевременная оптимизация чего-то подобного не стоит того времени, которое понадобилось мне, чтобы написать этот ответ.
0 голосов
/ 14 января 2011

StringBuilder, вероятно, лучший класс для этого, так как он не будет создавать дополнительные копии базового символьного буфера во время замен.Если вы чувствительны к производительности, то String может быть плохим, потому что он создает копии строки при каждом вызове Replace, а использование Regex, вероятно, будет хуже прямого поиска и замены StringBuilder.

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

Я обнаружил, используя этот код, реализующий сопоставление строк Aho-Corasick , чтобы найти все строки для сопоставления, а затем только один раз обработать вашу строку, когда StringBuilder выполняет замены, было намного лучше, чем зацикливание с набором замены строк по одному.

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

Я бы пошел с RegEx.Replace. Эта перегрузка: http://msdn.microsoft.com/en-us/library/cft8645c.aspx

Все ваши различные входные данные могут быть сопоставлены в регулярном выражении, и все ваши различные строки замен могут быть помещены в ваш MatchEvaluator.

...