У меня есть цикл, где я создаю некоторую строковую стоимость на основе определенных условий. Я действительно помещал объект 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>");
}
Код с принятым ответом;
Установите длину равной 0 или в .Net 4. Я считаю, что вы можете вызвать новый метод Clear ().
Вы можете повторно использовать 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);
....
}
Поэтому, хотя ответы здесь о том, как это сделать, верны, лучший совет - не делать этого . Это микрооптимизация, и вам не нужен очень маленький выигрыш здесь, и вам не нужны (небольшие) дополнительные сложности. Вы можете немного оптимизировать здесь, если результирующая строка очень большая, но, конечно, не делайте это привычкой.
Предположим, вы определяете свой 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 ..
}