[英]How can I know if String.Replace or StringBuilder.Replace will modify the string?
我想知道是否需要在字符串上执行String.Replace
/ StringBuilder.Replace
。
因此,我有两种方法可以做到这一点。
第一种方式:
var myString = new StringBuilder("abcd");
var copyMyString = myString;
myString = myString.Replace("a", "b");
if (!myString.Equals(copyMyString))//If the string Is changed
{
//My Code
}
第二个:
var pos = myString.ToString().IndexOf("a");
if (pos > 0)
{
myString = myString.Replace("a", "b");
//After this line the string is replaced.
//My Code
}
什么是执行此操作(性能)的更快方法?
还有另一种方法吗?
字符串长度有时可以是1MB或更多。
您可以通过修改第二种方法来加快速度,如下所示:
var pos = myString.ToString().IndexOf("a");
if (pos > 0)
{
myString = myString.Replace("a", "b", pos, myString.Length - pos);
//After this line the string is replaced.
//My Code
}
现在,我们调用StringBuilder.Replace()
的重载,该重载指定了起始索引 。
现在,无需再次搜索字符串的第一部分。 不过,这不太可能节省很多时间-但会节省一些时间。
这取决于pos > 0
(注意应该应该是pos >= 0
)为真的频率。 .IndexOf()
将循环遍历每个字符,直到找到您要查找的字符为止,所以它是O(n)
,这是一个非常便宜的操作,因为它仅是一次搜索。
这里的高成本是String.Replace()
。 对于经常在字符串下进行修改的字符串,可能会覆盖该字符串,字符串越大,成本越高。 由于它可以找到所有出现的位置,因此也可以有多个替换。
因此,除非pos >= 0
几乎始终为true
,否则第二种情况会更有效,但是您应该删除.ToString()
因为它什么也不做。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.