我已经为堆栈编写了一个程序。 (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*/
答案 0 :(得分:2)
您可以使用Array.ConvertAll和String.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);
}