Подтвердить что ты не робот

Как сделать StringBuilder пустым снова в .NET 3.5?

У меня есть цикл, где я создаю строковое значение, основанное на определенных условиях. Я разместил объект StringBuilder вне цикла, и каждый раз, когда у меня есть новая строка в цикле, мне нужно очистить добавленные значения StringBuilder для этой строки.

Как очистить их?

        StringBuilder sb = new StringBuilder();

        foreach (DataRow row in recipientsList.Rows)
        {
            sb.Length = 0;
            sb.Append("<ul>");
            if (row["needsToActivate"] == "1")
            {
                sb.AppendFormat("<li>{0}</li>", getUsersWithoutActivationTemplate());
            }
            if (row["needsToEnterSite"] == "1")
            {
                sb.AppendFormat("<li>{0}</li>", getUsersWithoutEnteringWebsiteForTwoWeeksTemplate());
            }
            if (row["needsPicture"] == "1")
            {
                sb.AppendFormat("<li>{0}</li>", getUsersWithoutPicturesTemplate());
            }
            if (row["needsText"] == "1")
            {
                sb.AppendFormat("<li>{0}</li>", getUsersWithoutTextTemplate());
            }
            if (row["needsCharacteristic"] == "1")
            {
                sb.AppendFormat("<li>{0}</li>", getUsersWithoutCharateristicsTemplate());
            }
            if (row["needsHobby"] == "1")
            {
                sb.AppendFormat("<li>{0}</li>", getUsersWithoutHobbiesTemplate());
            }
            sb.Append("</ul>");
}

Код с принятым ответом;

4b9b3361

Ответ 1

Вы можете просто:

sb.Length = 0;

Ответ 2

StringBuilder.Clear(); - это то, что вы хотите.

Ответ 3

Установить длину в 0 или в .Net 4 Я считаю, что вы можете вызвать новый метод Clear().

Ответ 4

Предполагая, что вы определяете свой StringBuilder следующим образом:   StringBuilder sb = new StringBuilder();

Вы можете выполнить любое из следующих действий:

Вызвать метод Clear:

for (int i = 0; i < 100; i++)
{
    sb.Clear();
    .. your code here ..
}

Установите длину в ноль:

for (int i = 0; i < 100; i++)
{
    sb.Length = 0;
    .. your code here ..
}

Установите его для нового объекта:

for (int i = 0; i < 100; i++)
{
    sb = new StringBuilder();
    .. your code here ..
}

Ответ 5

Вы можете повторно использовать StringBuilder (с .Clear() или .Length = 0), но если вы действительно хотите оптимизировать, вы должны попытаться оценить окончательную длину. Если это увеличивается немного за каждую итерацию, повторное использование может быть медленнее (использовать больше памяти), чем создавать новую каждый раз.

foreach (DataRow row in recipientsList.Rows)
{
    int estimatedLength = 5000; // maybe a calculation based on row-data
    StringBuilder sb = new StringBuilder(estimatedLength);
    ....

}

Так что, хотя ответы здесь о том, как это сделать, верны, лучший совет - не делать это. Это микрооптимизация, и вам здесь не нужны очень маленькие выгоды, и вам не нужны (маленькие) дополнительные сложности. Вы могли бы немного оптимизировать здесь, если полученная строка очень большая, но, конечно, не делайте это привычкой.

Ответ 6

Я столкнулся с подобной проблемой.

Этот трюк сработал для меня

sb.Replace(sb.ToString(), "");

Этот код заменит всю строку на "".

Ответ 7

Что я узнал, так это

sb.Length = 0;

Но мой ответ включает подсказку о том, как использовать StringBuilder без фрагментации памяти. Вы стараетесь установить нулевую длину и использовать ее повторно, чтобы не перераспределять ее все время. Почему бы не пойти дальше и уменьшить фрагментацию или частые распределения?

StringBuilder sb = new System.Text.StringBuilder(22_000); // preallocate ~20K

Если вы можете сказать, сколько места вам нужно, рассмотрите возможность выделения пространства, которое StringBuilder будет использовать заранее. Существует причина, по которой конструктор позволяет указать, сколько места нужно выделить, - это повышает производительность. Одно распределение сразу должно быть быстрее, чем множество небольших выделений, вкрапленных в другие.

Итак, я пропущу некоторые данные в коде, посмотрю на размер StringBuilder, умножу на некоторый коэффициент и положу его в качестве начального размера выделения для StringBuilder.