2010-07-12 19 views
18

Belirli koşullara göre bazı dize değeri oluşturduğum bir döngüye sahibim. StringBuilder nesnesini döngünün dışında bir yer yaptım ve her defasında yeni satırda yeni satır var. Bu satır için StringBuilder eklenmiş değerleri temizlemem gerekiyor..NET 3.5'te StringBuilder'ı yeniden boş hale nasıl getirebilirim?

Bunları nasıl temizlerim?

 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>"); 
} 

Kabul edilen yanıtla kodu;

+0

Döngü sırasında veya bittikten sonra takas işlemini ne zaman yapmak istersiniz? –

+0

bazı kodları gösterebilir, sadece en son değeri korumak istediğiniz gibi görünür. –

cevap

47

Basitçe;) StringBuilder sb = new StringBuilder (;:

sb.Length = 0; 
+0

tam olarak ne ihtiyacım var. Sorunu karmaşıklaştıran neredeyse sb.Remove() kullandım. – eugeneK

+2

bunu kullanabilirsiniz: sb.Remove (0, sb.Length); – AminM

+2

Çok uzun dizelerle çalışırken en iyi fikir bu değil. OOM istisnasına neden olabilir. Daha fazla açıklama MSDN'de sağlanmıştır: https://social.msdn.microsoft.com/Forums/en-US/db04ba8c-e13e-4d41-89a2-f5601ec3e0ae/outofmemoryexception-setting-stringbuilder-length-to-0?forum=vbgeneral –

12

StringBuilder.Clear(); istediğin şeydir.

+2

.NET 3.5 Üzgünüz! – eugeneK

+9

Bu yalnızca .Net 4. 'de kullanılabilir. Net <= 3.5' sb.Length = 0; ' – codekaizen

4

Uzunluğunu 0 olarak ayarlayın veya .Net 4 Yeni Clear() yöntemini çağırabileceğinizi düşünüyorum.

2

böyle senin StringBuilder tanımlamak varsayarsak sıfıra

for (int i = 0; i < 100; i++) 
{ 
    sb.Clear(); 
    .. your code here .. 
} 

uzunluğunu ayarlayın:

Çağrısı Temizle yöntemle:

Aşağıdakilerden herhangi birini yapabilirsiniz

for (int i = 0; i < 100; i++) 
{ 
    sb.Length = 0; 
    .. your code here .. 
} 

Set yeni bir nesneye:

for (int i = 0; i < 100; i++) 
{ 
    sb = new StringBuilder(); 
    .. your code here .. 
} 
+0

Bu sonuncusu, StringBuilder'ı ilk etapta kullanmanın amacını yener ... – codekaizen

+0

@codekaizen, agree! – eugeneK

+1

@codekaizer: Hayır, bu sonuncusu muhtemelen bu şeyi tekrar kullanmak kadar verimli. SB'nin gerçek kullanımı, döngünün geri kalanında olan şeydir. –

2

You c Bir StringBuilder (.Clear() veya .Length = 0 ile yeniden kullanın) ancak gerçekten optimize etmek istiyorsanız, son uzunluğu tahmin etmeyi deneyin. Eğer bu her bir yinelemeyi biraz büyütürse, yeniden dava etmek her seferinde yeni bir tane yaratmaktan daha yavaş (daha çok mem) olabilir. İşte yanıtlar yaklaşık nasıl doğru ise

foreach (DataRow row in recipientsList.Rows) 
{ 
    int estimatedLength = 5000; // maybe a calculation based on row-data 
    StringBuilder sb = new StringBuilder(estimatedLength); 
    .... 

} 

Yani, en iyi tavsiye bunu yapmamaya olduğunu. Bu bir mikro optimizasyon ve burada çok küçük kazançlar gerekmez ve (küçük) ekstra komplikasyonlar istemezsiniz. Sonuçta ortaya çıkan dize çok büyükse, ama burada bir alışkanlık yapmazsanız, burayı biraz optimize edebilirsiniz.

+0

uzunluğu en fazla sekiz, daha düşük olabilir. Yani, varsayılan uzunluğu atadığımda, sb.Length = 0'a ihtiyacım yok mu, yoksa sadece daha küçük bir nesne oluşturacak ve zamanı azaltacak mı? – eugeneK

+0

Eğer bu AppendFormat() çağrılarına bakarsak, boyunuz sekizden daha büyük olacaktır. Ama evet, beklenen uzunluk için iyi bir tahmin kullanın ve bu şekilde yeniden kullanmaya çalışmayın. –

+0

Ben 8 eklenmiş en büyük dizenin uzunluğu veya uzunluğu olması gerekiyordu yöntemleri ekle? – eugeneK

İlgili konular