如何在.NET 3.5中再次使StringBuilder空?

时间:2010-07-12 09:30:25

标签: c# asp.net .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>");
}

接受答案的代码;

7 个答案:

答案 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的初始分配大小。