改进 .NET 中的 String.Insert

本文关键字:Insert String 中的 NET 改进 | 更新日期: 2023-09-27 17:55:26

我需要用标识符标记一个字符串,指示已通过测试的子字符串的开始和结束。

假设我有字符串"敏捷的棕色狐狸跳过懒惰的狗",我想用一个标签标记字符串,每个单词都以字符"b"和"o"开头。最后一根弦看起来像"快速<tag>brown</tag>狐狸<tag>over</tag>懒狗跳

"。

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

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

改进 .NET 中的 String.Insert

你应该使用StringBuilder .

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

或者,将逻辑移动到 MatchEvaluator lambda 表达式并调用 RegeEx.Replace

试试这个:

正则表达式

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

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

您可以

直接使用RegEx - 它有一个Replace方法,应该允许您在匹配项周围插入标签。

但是,我不能保证这样做的速度。您可以编译 RegEx ,这应该可以提高性能,但即使这样,您也需要根据具体情况进行测试。

众所周知,字符串操作非常慢。 请改用 System.Text.StringBuilder。

它还有一个插入方法。

此外,MSDN 有一篇关于改进提高字符串处理性能的好文章,将 StringBuilder 与正常的字符串操作进行了比较。 如果您以前从未遇到过这个主题,那么值得一读。