2010-04-11 8 views
1

J'ai écrit un programme pour une pile. (https://stackoverflow.com/questions/2617367?tab=votes#tab-top) Pour cela j'avais besoin d'un StringBuilder pour être capable de me montrer ce qui était dans la pile sinon j'obtiendrais le nom de classe au lieu des valeurs réelles à l'intérieur.Question liée à StringBuilder

Ma question existe-t-il d'une autre manière, sauf pour un StringBuilder pour ce genre de problème?
Dans quel autre genre de cas ce type de problème se produit-il? Aussi la façon dont j'ai écrit le StringBuilder m'a paru très gênant quand j'avais besoin de plusieurs choses sur 1 ligne.

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

Je ne comprends pas le but de 'tabel.Length == tabel.Length'. Est-ce un bug/typo? –

+0

et quoi de neuf? – wcm

+0

Je pense que cela signifiait être valeur == tabel.length –

Répondre

1

Ceci est l'utilisation correcte d'un constructeur de chaîne (bien que votre code ressemble bogué)

Notez que vous pouvez utiliser AppendLine si vous voulez faire une pause de lien au lieu d'utiliser des espaces.

Vous pouvez également utiliser AppendFormat qui est l'équivalent de string.format par exemple

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

Vous pouvez utiliser Array.ConvertAll et String.Join au lieu de itérer la liste vous-même. En outre, lorsque vous parlez de plusieurs choses sur une ligne ... vous n'avez aucun saut de ligne nulle part.

Ou, si vous continuez à utiliser StringBuilder, la méthode Append retourne la StringBuilder de sorte que vous pouvez enchaîner les appels ensemble:

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

Si vous ne parcourez pas la liste, comment obtiendrez-vous le dernier élément à dire haut? –

+0

Vous pouvez: * changer le dernier élément du tableau de chaînes que vous obtenez en utilisant ConvertAll * ou comme c'est le dernier élément, il suffit de concaténer le tag après avoir joint le tout. –

2

Vous pouvez utiliser une méthode d'extension comme celui-ci pour résumer les collections énumérables

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

Utilisation

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

PS I f vous utilisez .NET avant la version 4 vous pourriez avoir besoin d'un .ToArray() là pour satisfaire string.join()

Ou, mieux encore, en utilisant la surcharge: string Join<T>(string separator, IEnumerable<T> values); vous pouvez simplifier à: -

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

Utilisation

string result = tabel.ToStringList(50); 
1

ToString() remplace comme celui-ci pour une classe de collecte travaillent rarement bien dans la pratique. Ils ne se comportent pas bien quand vous avez des milliers d'éléments dans la collection. Une visualisation correcte consiste à afficher l'élément supérieur et le nombre d'éléments. Par exemple:

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