我想知道我是否需要在字符串上执行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甚至更多。
答案 0 :(得分:1)
您可以通过修改第二种方法来加快速度:
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
}
我们现在致电the overload of StringBuilder.Replace()
which specifies a starting index。
现在它不需要再次搜索字符串的第一部分。这不太可能节省很多时间 - 但它会节省一点。
答案 1 :(得分:0)
这取决于pos > 0
(注意应该是pos >= 0
)的频率。 .IndexOf()
会循环显示每个字符,直到找到您要查找的字符为O(n)
,这是一个非常便宜的操作,因为它只是一次搜索。
这里的高成本是String.Replace()
。对于经常修改它们的字符串可以覆盖字符串,字符串越大,成本越高。这也可以有多次替换,因为它找到了所有的事件。
因此,除非pos >= 0
几乎总是true
,否则第二种情况会更有效,但您应该放弃.ToString()
,因为它什么都不做。