我有一个循环,我根据某些条件创建一些字符串值。我确实在循环之外放置了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 :(得分:49)
你可以简单地说;
sb.Length = 0;
答案 1 :(得分:13)
StringBuilder.Clear();
就是你想要的。
答案 2 :(得分:4)
将长度设置为0,或者设置为.Net 4我相信你可以调用新的Clear()方法。
答案 3 :(得分:3)
假设您像这样定义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 ..
}
答案 4 :(得分:3)
您可以重复使用StringBuilder(.Clear()或.Length = 0)但如果您真的想要优化,则应尝试估计最终长度。如果每次迭代增加一点,重新使用可能比每次创建一个新的更慢(使用更多的mem)。
foreach (DataRow row in recipientsList.Rows)
{
int estimatedLength = 5000; // maybe a calculation based on row-data
StringBuilder sb = new StringBuilder(estimatedLength);
....
}
所以虽然这里关于如何的答案是正确的,但最好的建议是不要这样做。这是一个微观优化,你不需要这里非常小的收益,你不需要(小)额外的复杂性。如果结果字符串非常大,你可以在这里优化一点,但肯定不会成为习惯。
答案 5 :(得分:0)
我遇到了类似的问题。
这个技巧对我有用
sb.Replace(sb.ToString(), "");
此代码将用""
替换整个字符串。
答案 6 :(得分:0)
我学到的是
sb.Length = 0;
但是我的答案包含了有关如何使用StringBuilder而不分散内存的提示。您要小心地将长度设置为零并重新使用它,因此您不必一直都在重新分配它。为什么不更进一步,减少碎片或频繁分配呢?
StringBuilder sb = new System.Text.StringBuilder(22_000); // preallocate ~20K
如果您几乎可以确定需要多少空间,请考虑分配StringBuilder将要预先使用的空间。构造函数允许您指定要分配的空间是有原因的-它可以提高性能。一次分配一次比所有其他分配的小分配要快。
因此,我将通过代码运行一些数据,查看StringBuilder的大小,乘以某个因子,然后将其作为StringBuilder的初始分配大小。