改进.Net中的String.Insert?

时间:2011-05-06 19:14:12

标签: c# .net string

我需要标记一个字符串,其中包含指示已通过测试的子字符串的开头和结尾的标识符。

假设我有一个字符串“快速的棕色狐狸跳过懒狗”,我想用字符'b'和'o'开头的每个单词标记字符串。最后的字符串看起来像“快速<tag>brown</tag>狐狸跳跃<tag>over</tag>懒狗”。

使用正则表达式和LINQ的组合我有正确的逻辑来完成我想要的但我的性能不是我想要的,因为我使用String.Insert插入标记。我们的字符串可以很长(> 200k)并且标记的子字符串的数量可以接近一百。下面是我用来插入标签的代码。鉴于我知道每个子字符串的开始和长度,如何更快地更新字符串'input'?

.ForEach<Match>(m => {
  input = input.Insert(m.Index + m.Length, "</tag>");
  input = input.Insert(m.Index, "<tag>");
});

4 个答案:

答案 0 :(得分:10)

您应该使用StringBuilder

为获得最佳性能,请在执行任何操作之前设置StringBuilder的容量,然后在标记之间附加原始字符串的块。

或者,将您的逻辑移至MatchEvaluator lambda表达式并调用RegeEx.Replace

答案 1 :(得分:2)

试试这个:

正则表达式

Regex.Replace("The quick brown fox jumps over the lazy dog", @"(^|\s)([bo]\w*)", "$1<tag>$2</tag>");

结果

The quick <tag>brown</tag> fox jumps <tag>over</tag> the lazy dog

正则表达式应该提供相当快速的替换。这种方法是否最好取决于字符串的长度以及实际匹配一个“单词”所涉及的工作量。

答案 2 :(得分:1)

字符串操作非常慢。请改用System.Text.StringBuilder

它还有一个Insert方法。

此外,MSDN有一篇关于改进Improving String Handling Performance 的文章,它将StringBuilder与普通的String操作进行比较。如果您之前从未遇到过这个话题,那么值得一读。

答案 3 :(得分:1)

您可以直接使用RegEx - 它有一个Replace方法,可以让您在匹配项周围插入标记。

但是,我不能保证这个速度。您可以compile RegEx,这可以提高效果,但即使这样,您也需要根据具体情况进行测试。