簡體   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