我怎么知道String.Replace或StringBuilder.Replace是否会修改字符串?

时间:2017-03-17 13:15:17

标签: c# 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甚至更多。

2 个答案:

答案 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(),因为它什么都不做。