StringBuilder связанный вопрос - PullRequest
       8

StringBuilder связанный вопрос

1 голос
/ 11 апреля 2010

Я написал программу для стека. (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*/ 

Ответы [ 4 ]

2 голосов
/ 11 апреля 2010

Вы можете использовать Array.ConvertAll и String.Join вместо того, чтобы выполнять итерацию списка самостоятельно.

Кроме того, когда вы говорите о нескольких вещах в одной строке ... у вас нигде нет разрывов строк.

Или, если вы продолжаете использовать StringBuilder, метод Append возвращает StringBuilder, чтобы вы могли объединять вызовы вместе:

 sb.Append("(top: ").Append(top).Append(")").AppendLine();
2 голосов
/ 11 апреля 2010

Вы можете использовать такой метод расширения для суммирования перечисляемых коллекций

/// <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 Если вы используете .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 голос
/ 11 апреля 2010

Подобные переопределения ToString () для класса коллекции редко бывают успешными на практике. Они плохо себя ведут, когда в коллекции тысячи элементов. Достойной визуализацией является отображение верхнего элемента и количества элементов. Например:

public override string ToString() {
  if (this.Count == 0) return "Empty";
  else return string.Format("Top:{0}, Count:{1}", top, Count);
}
1 голос
/ 11 апреля 2010

Это правильное использование строителя строк (хотя ваш код выглядит некорректно)

Обратите внимание, что вы можете использовать AppendLine, если хотите разорвать ссылку вместо пробелов.

Вы также можете использовать AppendFormat, который эквивалентен string.format, например,

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