簡體   English   中英

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

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM