繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM