1

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

我的问题是除了 StringBuilder 之外还有其他方法可以解决此类问题吗?
另外在哪些其他情况下会发生这种问题?当我在 1 行上需要几件东西时,我编写 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

4 回答 4

2

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

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

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

 sb.Append("(top: ").Append(top).Append(")").AppendLine();
于 2010-04-11T16:35:14.970 回答
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);
于 2010-04-11T16:35:39.680 回答
1

这是字符串生成器的正确用法(尽管您的代码看起来有问题)

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

您还可以使用相当于 string.format 的 AppendFormat,例如

builder.AppendFormat("(top:{0})", value);
于 2010-04-11T16:33:50.327 回答
1

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

public override string ToString() {
  if (this.Count == 0) return "Empty";
  else return string.Format("Top:{0}, Count:{1}", top, Count);
}
于 2010-04-11T16:37:32.680 回答