我需要在文本中找到以[并以]结尾的所有内容,并将其替换为函数返回的值。所以,这是我正在做的一个例子:
public string ProcessTemplate(string input)
{
return Regex.Replace(input, @"\[(.*?)\]", new MatchEvaluator(delegate(Match match)
{
return ProcessBlock(match.Result("$1"));
}));
}
public string ProcessBlock(string value)
{
return Block.FromString(value).Process();
}
现在,我的问题是我需要编辑块。所以我想找到块,编辑它们,然后然后在文本中替换它们。
因此,我创建了一个块列表,并将ProcessTemplate
方法分为两个方法:FindBlocks
和ReplaceBlocks
:
public void FindBlocks(string input)
{
Input = input;
foreach (Match match in Regex.Matches(input, @"\[(.*?)\]"))
Blocks.Add(Block.FromString(match.Result("$1")));
}
public string ReplaceBlocks()
{
string input = Input;
foreach (Block block in Blocks)
input = input.Replace("[" + block.OrginalText + "]", block.Process);
return input;
}
public IList<Block> Blocks
{
get;
set;
}
public string Input
{
get;
set;
}
它有效,但问题是它很慢。我用System.Diagnostics.Stopwatch
测量了每个部分,我发现String.Replace
方法中的ReplaceBlocks
非常慢。
我该如何改进?
感谢。
答案 0 :(得分:1)
将ReplaceBlock中的字符串替换为StringBuilder可能会提高性能,因为每次执行string.replace时都必须释放字符串并重新分配字符串。字符串生成器不需要这样做。
使用以下内容替换ReplaceBlock的内容。
// This will require a reference to System.Text
StringBuilder input =new StringBuilder(Input);
foreach (Block block in Blocks)
{
input = input.Replace("[" + block.OrginalText + "]", block.Process);
}
return input.ToString();
我还发现用for循环替换foreach循环更快。
答案 1 :(得分:0)