在C#中,我有一个StringBuilder sb
,我在for循环中多次添加它。如何获取最后一个字符串附加到StringBuilder?
StringBuilders
是否有一个简单的方法将最后一个字符串附加到它后面?
在C#中,我有一个StringBuilder sb
,我在for循环中多次添加它。如何获取最后一个字符串附加到StringBuilder?
StringBuilders
是否有一个简单的方法将最后一个字符串附加到它后面?
没有。你或许应该使用字符串列表,然后在以后加入它来代替StringBuilder
功能是这样的:
List<string> strings = new List<string>();
strings.Add("...");
string result = string.Join("", strings);
然后,您可以通过访问字符串列表的最后一个索引访问最近添加的字符串或使用Last()
LINQ扩展这样的:
string lastString = strings.Last();
您可以创建一个附加记得最后一个字符串自己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();
你真的认为这些优点大于劣势吗?我宁愿一个从'StringBuilder'继承的定制类,或者更好一些,而不是一个静态字符串,只需使用一个'string'变量来跟踪最后附加的字符串。 –
'StringBuilder'是一个密封的类,所以不能被继承。我认为这样做可以在框架中进行高度优化,而不需要我们这些凡人搞砸它。 – Stainy
@Stainy:很好,所以你可以使用一个持有'StringBuilder'的类,或者没有额外的类/扩展,但只是一个跟踪的字符串。 –
由于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();
}
}
'StringBuilder'不会跟踪所有更改。 –