2016-11-29 75 views
0

这是一个常见问题,但我希望这不会被标记为重复项,因为问题的性质不同(请阅读整个不仅是标题)用字符串替换char(0x10)(优化方式)

未察觉的String.Replace存在我写了下面:

int theIndex = 0; 

while ((theIndex = message.IndexOf(separationChar, theIndex)) != -1) //we found the character 
{ 
    theIndex++; 
    if (theIndex < message.Length)//not in the last position 
    { 
     message = message.Insert(theIndex, theTime); 
    } 
    else 
    { 
     // I dont' think this is really neccessary 
     break; 
    } 

} //while finding characters 

正如你可以看到我更换separationChar的出现在一个名为“theTime”字符串的消息字符串。

现在,这适用于小字符串,但我已经给了一个非常巨大的字符串(大约数百字节的顺序 - 顺便说一下String或StringBuilder的限制??),它需要很多时间...

所以我的问题是:

1)它是更有效的,如果我只是做

oldString=separationChar.ToString(); 
newString=oldString.Insert(theTime); 

message= message.Replace(oldString,newString); 

2)是否有任何其他的方式,我可以处理非常长的字符串插入字符串(theTime)以非常快的速度查找一些char 高效的方式??

由于已经提到了很多

+0

使用'StringBuilder'它是一个可变类,所以每个操作不必实例化一个新的字符串,只需修改它。 – Danny

+0

你认为这会对速度产生影响吗? – KansaiRobot

+1

如果你处理足够大的字符串,你有性能问题,我希望它可以帮助是的。 – Danny

回答

0

丹尼,string.Insert()实际上创建每次使用它的时间实例,这些也必须在某些时候垃圾收集。

你可以代替一个空StringBuilder开工建设的结果字符串:

public static string Replace(this string str, char find, string replacement) 
{ 
    StringBuilder result = new StringBuilder(str.Length); // initial capacity 
    int pointer = 0; 
    int index; 
    while ((index = str.IndexOf(find, pointer)) >= 0) 
    { 
     // Append the unprocessed data up to the character 
     result.Append(str, pointer, index - pointer); 
     // Append the replacement string 
     result.Append(replacement); 
     // Next unprocessed data starts after the character 
     pointer = index + 1; 
    } 

    // Append the remainder of the unprocessed data 
    result.Append(str, pointer, str.Length - pointer); 
    return result.ToString(); 
} 

这会不会引起新string为字符的每次出现时创建(垃圾收集)。相反,当StringBuilder的内部缓冲区已满时,它将创建一个具有足够容量的新缓冲区块。引自reference source,当它的缓冲区已满:

计算新的块中,我们需要

我们作出新的块体至少在目前需要(minBlockCharCount)足够大的长度,也可作为大作为当前长度(因此容量加倍),最大可达到 (所以我们停留在小对象堆中,即使 字符串变得非常大,也不会分配真正的大块)。

0

谢谢你回答我的问题。 我写了一个答案,因为我必须报告我在我的问题1)中尝试了解决方案,根据我的程序结果确实更高效。 String.Replace可以非常快地用另一个字符串替换字符串(来自char)。

oldString=separationChar.ToString(); 
newString=oldString.Insert(theTime); 

message= message.Replace(oldString,newString);