[英]How to make StringBuilder empty again in .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>");
}
代码接受答案;
你可以简单地;
sb.Length = 0;
StringBuilder.Clear();
是你想要的。
将Length设置为0,或者设置为.Net 4我相信你可以调用新的Clear()方法。
假设您像这样定义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 ..
}
您可以重复使用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);
....
}
所以尽管这里关于如何做到这一点的答案是正确的,但最好的建议是不要这样做 。 这是一个微观优化,你不需要这里非常小的收益,你不需要(小)额外的复杂性。 如果结果字符串非常大,你可以在这里优化一点,但肯定不会成为习惯。
我遇到了类似的问题。
这招对我有用
sb.Replace(sb.ToString(), "");
此代码将用""
替换整个字符串。
我学到的是
sb.Length = 0;
但我的回答包括如何在不破坏内存的情况下使用StringBuilder的提示。 您要小心将长度设置为零并重复使用,因此您不会一直重新分配它。 为什么不更进一步,减少碎片或频繁的分配?
StringBuilder sb = new System.Text.StringBuilder(22_000); // preallocate ~20K
如果你几乎可以告诉你需要多少空间,可以考虑分配StringBuilder将要预先使用的空间。 构造函数允许您指定分配多少空间是有原因的 - 它可以提高性能。 一次性分配应该比散布其他分配的许多小分配更快。
因此,我将通过代码运行一些数据,查看StringBuilder大小,乘以某个因子,并将其作为StringBuilder的初始分配大小。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.