2010-04-11 80 views
1

我已經編寫了一個堆棧程序。 (https://stackoverflow.com/questions/2617367?tab=votes#tab-top) 爲此我需要一個StringBuilder能夠告訴我什麼是在堆棧中,否則我會得到類名而不是實際的值。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*/ 
+2

我不明白'tabel.Length == tabel.Length'的用途。這是一個錯誤/錯字? – 2010-04-11 16:27:33

+0

什麼是頂部? – wcm 2010-04-11 16:29:26

+0

我認爲這意味着價值== tabel.length – 2010-04-11 16:30:25

回答

1

這是正確使用一個字符串生成器(雖然你的代碼看起來越野車)

注意您可以使用AppendLine如果你想要一個鏈路中斷,而不是使用空間。

您還可以使用AppendFormat是的String.Format例如相當於

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

你可以使用Array.ConvertAllString.Join迭代,而不是自己的名單。另外,當你在一條線上談論多件事時......你在任何地方都沒有任何linebreak。

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

如果你不重複列表,你將如何得到最後一個項目頂部? – 2010-04-11 16:39:18

+0

您可以: *更改您使用ConvertAll *得到的字符串數組的最後一個元素,或者因爲它是最後一個元素,只需在加入整個事件後連接標記即可。 – 2010-04-11 16:53:33

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

或者,如果您繼續使用StringBuilder的,這樣你就可以調用鏈在一起Append方法返回的StringBuilder

用法

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

PS I F你使用的是.NET之前的版本4,你可能需要一個.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); 
1

的ToString()覆蓋這樣一個集合類很少在實踐工作搞好。當您收集了數千個元素時,它們表現不佳。一個體面的可視化是顯示頂部的元素和元素的數量。例如:

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