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

在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"); } 

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

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

 var sb = new StringBuilder(mystring); sb.Replace("abc", "a"); sb.Replace("def", "aa"); sb.Replace("ghi", "assd"); 

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

  sb.Replace("abc", "a"); sb.Replace("def", "aa"); sb.Replace("ghi", "assd"); 

如果找不到要Replace的第一个参数中的字符串,则对Replace的调用是一个空操作 – 正是您想要的。

文件说明:

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

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

您可以编写一个将方法扩展到StringBuilder对象的类。 在这里,我已经将StringOf,Substring和其他方法添加到StringBuilder类中。 把这个类放在你的项目中。

 using System; using System.Text; namespace Helpers { ///  /// Adds IndexOf, IsStringAt, AreEqual, and Substring to all StringBuilder objects. ///  public static class StringBuilderExtension { // Adds IndexOf, Substring, AreEqual to the StringBuilder class. public static int IndexOf(this StringBuilder theStringBuilder,string value) { const int NOT_FOUND = -1; if (theStringBuilder == null) { return NOT_FOUND; } if (String.IsNullOrEmpty(value)) { return NOT_FOUND; } int count = theStringBuilder.Length; int len = value.Length; if (count < len) { return NOT_FOUND; } int loopEnd = count - len + 1; for (int loop = 0; loop < loopEnd; loop++) { bool found = true; for (int innerLoop = 0; innerLoop < len; innerLoop++) { if (theStringBuilder[loop + innerLoop] != value[innerLoop]) { found = false; break; } } if (found) { return loop; } } return NOT_FOUND; } public static int IndexOf(this StringBuilder theStringBuilder, string value,int startPosition) { const int NOT_FOUND = -1; if (theStringBuilder == null) { return NOT_FOUND; } if (String.IsNullOrEmpty(value)) { return NOT_FOUND; } int count = theStringBuilder.Length; int len = value.Length; if (count < len) { return NOT_FOUND; } int loopEnd = count - len + 1; if (startPosition >= loopEnd) { return NOT_FOUND; } for (int loop = startPosition; loop < loopEnd; loop++) { bool found = true; for (int innerLoop = 0; innerLoop < len; innerLoop++) { if (theStringBuilder[loop + innerLoop] != value[innerLoop]) { found = false; break; } } if (found) { return loop; } } return NOT_FOUND; } public static string Substring(this StringBuilder theStringBuilder, int startIndex, int length) { return theStringBuilder == null ? null : theStringBuilder.ToString(startIndex, length); } public static bool AreEqual(this StringBuilder theStringBuilder, string compareString) { if (theStringBuilder == null) { return compareString == null; } if (compareString == null) { return false; } int len = theStringBuilder.Length; if (len != compareString.Length) { return false; } for (int loop = 0; loop < len; loop++) { if (theStringBuilder[loop] != compareString[loop]) { return false; } } return true; } ///  /// Compares one string to part of another string. ///  ///  /// Needle to look for /// Looks to see if the needle is at position in haystack /// Substring(theStringBuilder,offset,compareString.Length) == compareString public static bool IsStringAt(this StringBuilder haystack, string needle,int position) { if (haystack == null) { return needle == null; } if (needle == null) { return false; } int len = haystack.Length; int compareLen = needle.Length; if (len < compareLen + position) { return false; } for (int loop = 0; loop < compareLen; loop++) { if (haystack[loop+position] != needle[loop]) { return false; } } return true; } } } 

恕我直言,你不必在这种情况下使用StringBuilder … StringBuilder在循环中使用时更有用。 就像微软在本文中所说的那样

String对象是不可变的。 每次使用System.String类中的某个方法时,都会在内存中创建一个新的字符串对象,这需要为该新对象分配新的空间。 在需要对字符串执行重复修改的情况下,与创建新String对象相关的开销可能很昂贵。 如果要在不创建新对象的情况下修改字符串,可以使用System.Text.StringBuilder类。 例如,使用StringBuilder类可以在循环中将多个字符串连接在一起时提高性能

所以简单地说你可以使用String并避免使用ToString()……