我有一种方法可以替换除了指定字符以外的所有字符。例如,
ReplaceNot("test. stop; or, not", ".;/\\".ToCharArray(), '*');
希望返回:
"****.*****;***,****".
现在,这不是过早的优化实例。我在网络操作期间多次调用此方法。我发现对于较长的字符串,它会导致一些延迟,删除它有所帮助。任何加快速度的帮助都将不胜感激。
public static string ReplaceNot(this string original, char[] pattern, char replacement)
{
int index = 0;
int old = -1;
StringBuilder sb = new StringBuilder(original.Length);
while ((index = original.IndexOfAny(pattern, index)) > -1)
{
sb.Append(new string(replacement, index - old - 1));
sb.Append(original[index]);
old = index++;
}
if (original.Length - old > 1)
{
sb.Append(new string(replacement, original.Length - (old + 1)));
}
return sb.ToString();
}
最终结果。我还添加了一个测试用例,针对一个3K字符的字符串,运行100K次而不是1M,以查看每个算法的扩展性如何。唯一的惊喜是正则表达式比其他算法“更好”,但由于它本身非常慢,所以没有帮助:
用户 短 * 1M 长 * 100K 比例 John 319 2125 6.66 Luke 360 2659 7.39 Guffa 409 2827 6.91 Mine 447 3372 7.54 DirkGently 1094 9134 8.35 Michael 1591 12785 8.04 Peter 21106 94386 4.47
更新:我将Peter版本的正则表达式创建为静态变量,并将其设置为RegexOptions.Compiled,以公平起见:
用户 短 * 1M 长 * 100K 比例 Peter 8997 74715 8.30
我的测试代码Pastebin链接,请纠正我如果有错:http://pastebin.com/f64f260ee