是否需要在StringBuilder中替换字符串之前进行检查(使用"Contains"或"IndexOf"等函数)?

Roc*_*ngh 13 c# stringbuilder

C#中是否有任何方法IndexOf或Contains.以下是代码:

var sb = new StringBuilder(mystring);
sb.Replace("abc", "a");
string dateFormatString = sb.ToString();

if (sb.ToString().Contains("def"))
{
    sb.Replace("def", "aa");
}


if (sb.ToString().Contains("ghi"))
{
    sb.Replace("ghi", "assd");
}
Run Code Online (Sandbox Code Playgroud)

你可能已经注意到我一次又一次地使用ToString(),我想避免它,因为它每次都在创建新的字符串.你能帮帮我怎样才能避免它?

Jon*_*eet 19

如果StringBuilder 包含"def",那么执行替换不会导致任何问题,所以只需使用:

var sb = new StringBuilder(mystring);
sb.Replace("abc", "a");
sb.Replace("def", "aa");
sb.Replace("ghi", "assd");
Run Code Online (Sandbox Code Playgroud)

  • 从效率的角度来看,这也是一个好主意.做一个`Contains`然后一个`Replace`意味着你要搜索两次字符串.从高层次的角度来看,如果没有"def"的实例,"用""aa""替换所有'`def"`的实例仍然有意义. (2认同)

Dav*_*nan 5

没有这样的方法,StringBuilder但你不需要Contains测试.你可以这样写:

 sb.Replace("abc", "a");
 sb.Replace("def", "aa");
 sb.Replace("ghi", "assd");
Run Code Online (Sandbox Code Playgroud)

如果Replace未找到第一个参数to中的字符串,那么调用Replace是一个空操作 - 正是您想要的.

文件说明:

用此另一个指定的字符串替换此实例中指定字符串的所有匹配项.

你读这篇文章的方式是,当没有出现时,什么也没做.