2014-03-18 42 views

回答

3

没有。你或许应该使用字符串列表,然后在以后加入它来代替StringBuilder功能是这样的:

List<string> strings = new List<string>(); 
strings.Add("..."); 
string result = string.Join("", strings); 

然后,您可以通过访问字符串列表的最后一个索引访问最近添加的字符串或使用Last() LINQ扩展这样的:

string lastString = strings.Last(); 
+0

或者你可以在每个字符后面附加一个额外字符(除了最后一个字符),然后使用'LastIndexOf()'提取最后一个字符串。当然最后你必须用空字符串替换这些字符。 – Kapol

+0

你的意思是追加到现有的字符串?尽管取决于元素的数量,但这可能会成为性能问题。 – floele

+3

如果他只需要最后一个字符串,他应该继续使用'StringBuilder',但使用另一个只包含最后一个字符串的字符串变量。 –

0

您可以创建一个附加记得最后一个字符串自己StringBuilder扩展方法:

public static class StringBuilderExtensions 
{ 
    public static string LastStringAppended { get; private set; } 

    public static StringBuilder AppendRemember(this StringBuilder sb, object obj) 
    { 
     string s = obj == null ? "" : obj.ToString(); 
     LastStringAppended = s; 
     return sb.Append(s); 
    } 
} 

这样称呼它

sb.AppendRemember("hello").AppendRemember(" world"); 
string lastString = StringBuilderExtensions.LastStringAppended; 

但是请注意,最后一个字符串将在全球记忆。它不受限于StringBuilder实例。


如果你需要记住每StringBuilder实例在最近此外,还可以通过一本字典附加一个额外的“财产”的StringBuilder。我正在使用this implementation of ObjectReferenceEqualityComparer<T>。有必要忽略StringBuilder覆盖Equals并且不使用引用相等。

public static class StringBuilderExtensions 
{ 
    private static Dictionary<StringBuilder, string> _lastStrings = 
     new Dictionary<StringBuilder, string>(
      new ObjectReferenceEqualityComparer<StringBuilder>()); 

    public static string LastAppended(this StringBuilder sb) 
    { 
     string s; 
     _lastStrings.TryGetValue(sb, out s); 
     return s; // s is null if not found in the dict. 
    } 

    public static StringBuilder AppendRemember(this StringBuilder sb, object obj) 
    { 
     string s = obj == null ? "" : obj.ToString(); 
     _lastStrings[sb] = s; 
     return sb.Append(s); 
    } 
} 

使用方法如下:

sb.AppendRemember("hello").AppendRemember(" world"); 
string lastString = sb.LastAppended(); 
+0

你真的认为这些优点大于劣势吗?我宁愿一个从'StringBuilder'继承的定制类,或者更好一些,而不是一个静态字符串,只需使用一个'string'变量来跟踪最后附加的字符串。 –

+0

'StringBuilder'是一个密封的类,所以不能被继承。我认为这样做可以在框架中进行高度优化,而不需要我们这些凡人搞砸它。 – Stainy

+0

@Stainy:很好,所以你可以使用一个持有'StringBuilder'的类,或者没有额外的类/扩展,但只是一个跟踪的字符串。 –

0

由于floele回答,你可能会更好过只使用一个列表,然后加入它。但正如Olivier Jacot-Descombes和Tim Schmelter在他们的演讲中暗示的那样,您可以使用内部的StringBuilder来创建自己的类,然后您只需从StringBuilder中重新创建要使用的方法,并将最后附加的字符串存储在类中在一个属性。与Olivier的答案相比,这有两个关键优势:记住的字符串不是“全局”(它对每个实例都是唯一的),而且代码要简单得多。

public class StringBuilderRemember 
{ 
    private StringBuilder sb=new StringBuilder(); 
    public string LastString {get; private set;} 

    public void AppendLine(string s) 
    { 
     LastString=s; 
     sb.AppendLine(s); 
    } 
    public void Append(string s) 
    { 
     LastString=s; 
     sb.Append(s); 
    } 
    public string ToString() 
    { 
    return sb.ToString(); 
    } 
} 
相关问题