Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在.Net中改进String.Insert?_C#_.net_String - Fatal编程技术网

C# 在.Net中改进String.Insert?

C# 在.Net中改进String.Insert?,c#,.net,string,C#,.net,String,我需要用标识符标记一个字符串,该标识符指示通过测试的子字符串的开始和结束 假设我有一个字符串“敏捷的棕色狐狸跳过了懒惰的狗”,我想为每个以“b”和“o”开头的单词标记这个字符串。最后一个字符串看起来像“快速brownfox跳过lazy dog” 使用正则表达式和LINQ的组合,我有正确的逻辑来完成我想要的,但我的性能不是我想要的,因为我使用String.Insert来插入标记。我们的字符串可以很长(>200k),要标记的子字符串的数量可以接近100。下面是我用来插入标签的代码。如果我知道每个子字

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

假设我有一个字符串“敏捷的棕色狐狸跳过了懒惰的狗”,我想为每个以“b”和“o”开头的单词标记这个字符串。最后一个字符串看起来像“快速
brown
fox跳过
lazy dog”

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

.ForEach<Match>(m => {
  input = input.Insert(m.Index + m.Length, "</tag>");
  input = input.Insert(m.Index, "<tag>");
});
.ForEach(m=>{
输入=输入。插入(m.Index+m.Length,“”);
输入=输入。插入(m.Index,“”);
});

您应该使用
StringBuilder

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


或者,将逻辑移动到
匹配计算器
lambda表达式并调用
RegeEx.Replace

字符串操作速度非常慢。改用a

它也有一个方法


此外,MSDN还有一篇关于改进的文章,将StringBuilder与普通字符串操作进行了比较。如果您以前从未接触过此主题,那么值得一读。

您可以直接使用
RegEx
——它有一种方法可以让您在匹配项周围插入标记

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

尝试以下方法:

正则表达式
Regex.Replace(“敏捷的棕色狐狸跳过了懒狗,@”(^\s)([bo]\w*),“$1$2”);
结果 敏捷的棕色狐狸跳过了懒狗

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

能否使用基于正则表达式的解决方案?我想我需要更清楚地解释自己。我正在使用正则表达式,但我不能使用替换,因为我不想对所有匹配项执行替换,而只对其中的一些匹配项执行替换。因此,我使用我的测试条件,针对我的正则表达式调用的MatchCollection输出调用Where,并将结果输出集合通过管道传输到上面描述的Foreach。正如SLaks在下面所说的,有一个超负荷的
RegEx.Replace
,它允许您传入为每个匹配调用的函数。在该函数中,您可以根据具体情况决定如何处理每个匹配。感谢您的回复。我在原来的帖子上加了一条评论。我想这澄清了为什么我不能使用Regex.Replace。您的“where”子句可以移到Regex中吗?(你能发布“where”部分吗?.where(a=>ECAUtil.stemming.LuceneQueryStemmer.StemQuery(a.Value).Equals(stemmedkeyword))。正则表达式是词干/非词干单词/短语的组合。上述测试拒绝所有词干与词干不相等的匹配短语。谢谢您的回复。使用MatchEvaluator是一种方法。这比我之前做的要干净得多,而且看起来更快。
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