如何将最后一个字符串附加到StringBuilder?

时间:2014-03-18 21:29:17

标签: c# stringbuilder

在C#中,我有一个StringBuilder sb,我在for循环中多次追加。

StringBuilders是否有一个简单的方法可以吐出附加到它的最后一个字符串?

3 个答案:

答案 0 :(得分:4)

不。您应该使用字符串列表,然后将其加入以替换StringBuilder功能,如下所示:

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

然后,您可以通过访问字符串列表的最后一个索引来访问最近添加的字符串,或者使用Last() LINQ扩展名,如下所示:

string lastString = strings.Last();

答案 1 :(得分: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();

答案 2 :(得分:0)

当floele回答时,你可能最好只使用List然后加入它。但是正如Olivier Jacot-Descombes和Tim Schmelter在他们的记者中暗示的那样,你可以拥有一个内部StringBuilder的类,然后你只需要重新创建你想要使用的StringBuilder的方法,并将最后一个附加的字符串存储在你的类中在一个财产。与奥利维尔的答案相比,这有两个关键优势:记住的字符串不是全局的&#34; (它对每个实例都是唯一的),代码简单了很多倍。

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();
    }
}