我必须做很多文字替换。哪种类最适合以高效的方式进行此类操作?是StringBuilder吗?
StringBuilder stringBuilder=new StringBuilder(startString);
stringBuilder.Replace(literala1,literala2);
stringBuilder.Replace(literalb1,literalb2);
stringBuilder.Replace(literalc1,literalc2);
...
还是有更好的课程吗?顺便说一句,文字将主要是常数。
答案 0 :(得分:3)
这个问题在Roberto Farah的博客上详细讨论过: Comparing RegEx.Replace, String.Replace and StringBuilder.Replace – Which has better performance?
我将在这里总结一下这些发现,这让许多.NET开发人员感到震惊。事实证明,对于相对简单的字符串替换(在匹配不必区分大小写的情况下), RegEx.Replace()
的性能最差且 String.Replace()
< / strong>赢得最佳。
还提供了一个关于CodeProject的文章的链接,该文章证实了这些发现:StringBuilder vs String / Fast String Operations with .NET 2.0
总的来说,我会说规则应该如下:
String.Replace()
StringBuilder.Replace()
RegEx.Replace
)仅适用于最复杂的场景,值得为处理所有必要替换的单个表达式的优雅付出轻微的性能损失。 答案 1 :(得分:0)
我会选择RegEx.Replace。这个重载:http://msdn.microsoft.com/en-us/library/cft8645c.aspx
您可以在正则表达式中匹配所有不同的输入,并且所有不同的替换字符串都可以放在MatchEvaluator中。
答案 2 :(得分:0)
StringBuilder
可能是执行此操作的最佳类,因为它不会在替换期间创建底层字符缓冲区的额外副本。如果您对性能敏感,那么String
可能会很糟糕,因为它会在每次调用Replace
时创建字符串的副本,并且使用Regex
可能不如直接搜索 - 并替换StringBuilder
。
答案 3 :(得分:0)
我发现使用this code implementing Aho-Corasick string matching来查找要匹配的所有字符串,然后只使用StringBuilder只将字符串一次执行替换,这比使用一组字符串替换一次循环要好得多。