1

スタック用のプログラムを作成しました。(https://stackoverflow.com/questions/2617367?tab=votes#tab-top)このためには、スタックにあるものを表示できるようにするためにStringBuilderが必要でした。そうでない場合は、実際の値の代わりにクラス名を取得します。中身。

私の質問は、そのような種類の問題のためのStringBuilder以外の他の方法はありますか?
また、この種の問題は他にどのような場合に発生しますか?また、StringBuilderの記述方法は、1行にいくつかのものが必要な場合に非常に扱いにくいと感じました。

    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を使用できます。

また、1行で複数のことを話すとき...どこにも改行はありません。

または、引き続き 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を使用している場合、string.Join()を満たすために.ToArray()が必要になる場合があります

または、さらに良いことに、オーバーロードを使用すると、次の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 に答える