StringBuilder相关问题

时间:2010-04-11 16:24:18

标签: c# stringbuilder

我已经为堆栈编写了一个程序。 (https://stackoverflow.com/questions/2617367?tab=votes#tab-top) 为此,我需要一个StringBuilder来向我展示堆栈中的内容,否则我将获得类名而不是内部的实际值。

我的问题是除了针对这类问题的StringBuilder之外还有其他方法吗? 还有其他类型的情况会发生这种问题吗? 当我在一行需要几件东西时,我编写StringBuilder的方式感觉非常尴尬。

    public override string ToString()
    {
        StringBuilder builder = new StringBuilder();
        foreach (int value in tabel)
        {
            builder.Append(value);
            builder.Append("   ");
        }
        if (tabel.Length == tabel.Length) // this is a bit messy, since I couldn't append after the rest above
        {
            builder.Append("(top:");
            builder.Append(top);
            builder.Append(")");
        }
        return builder.ToString();
    }/*ToString*/ 

4 个答案:

答案 0 :(得分:2)

您可以使用Array.ConvertAllString.Join而不是自己迭代列表。

此外,当你在一行谈论多件事时......你在任何地方都没有任何换行符。

或者,如果继续使用StringBuilder,Append方法将返回StringBuilder,以便您可以将调用链接在一起:

 sb.Append("(top: ").Append(top).Append(")").AppendLine();

答案 1 :(得分:2)

您可以使用这样的扩展方法来总结可枚举的集合

/// <summary>
/// A better ToString for Enumerable objects (mostly for logging)
/// </summary>
public static string ToStringList(this IEnumerable<string> collection, int limit)
{
    return string.Join(", ", collection.Take(limit));
}

用法

string result = tabel.Select(x => x.ToString()).ToStringList(50);

PS如果你在版本4之前使用.NET,你可能需要一个.ToArray()来满足string.Join()

或者,更好的是,使用重载:string Join<T>(string separator, IEnumerable<T> values);您可以简化为: -

/// <summary>
/// A better ToString for Enumerable objects (mostly for logging)
/// </summary>
public static string ToStringList<T>(this IEnumerable<T> collection, int limit)
{
    return string.Join(", ", collection.Take(limit));
}

用法

string result = tabel.ToStringList(50);

答案 2 :(得分:1)

这是字符串构建器的正确使用(尽管您的代码看起来有些错误)

请注意,如果您想要链接中断而不是使用空格,则可以使用AppendLine。

你也可以使用AppendFormat,它等同于string.format,例如

builder.AppendFormat("(top:{0})", value);

答案 3 :(得分:1)

ToString()覆盖这样的集合类很少在实践中很好地解决。当你在集合中有数千个元素时,它们表现不佳。一个不错的可视化是显示顶部元素和元素数量。例如:

public override string ToString() {
  if (this.Count == 0) return "Empty";
  else return string.Format("Top:{0}, Count:{1}", top, Count);
}