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