2010-07-12 14 views
18

Ho un ciclo in cui creo un valore di stringa in base a determinate condizioni. Ho posto oggetto StringBuilder al di fuori del ciclo e ogni volta che ho una nuova riga in loop ho bisogno di cancellare i valori aggiunti StringBuilder per questa riga.Come rendere StringBuilder nuovamente vuoto in .NET 3.5?

Come posso cancellare quelli?

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

Codice con risposta accettata;

+0

Quando si desidera eseguire la pulizia durante il ciclo o dopo aver completato? –

+0

puoi mostrare del codice, sembra che tu voglia mantenere l'ultimo valore. –

risposta

47

È possibile semplicemente;

sb.Length = 0; 
+0

esattamente quello di cui avevo bisogno. Ho quasi usato sb.Remove() che complica il problema. – eugeneK

+2

è possibile utilizzare questo: sb.Remove (0, sb.Length); – AminM

+2

Non è la migliore idea quando si lavora con stringhe molto lunghe. Può causare l'eccezione di OOM. Ulteriori informazioni sono disponibili su MSDN: https://social.msdn.microsoft.com/Forums/en-US/db04ba8c-e13e-4d41-89a2-f5601ec3e0ae/outofmemoryexception-setting-stringbuilder-length-to-0?forum=vbgeneral –

12

StringBuilder.Clear(); è quello che vuoi.

+2

.NET 3.5 Siamo spiacenti! – eugeneK

+9

Questo è disponibile solo in .Net 4. .Net <= 3.5 deve usare 'sb.Length = 0;' – codekaizen

4

Impostare la lunghezza su 0 o su .Net 4 Credo che sia possibile chiamare il nuovo metodo Clear().

2

Supponendo che si definisce lo StringBuilder come questo: StringBuilder sb = new StringBuilder();

È possibile effettuare una delle seguenti operazioni:

Chiamare il metodo Clear:

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

Impostare la lunghezza a zero:

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

impostarlo su un nuovo oggetto:

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

Quest'ultimo piuttosto sconfigge lo scopo di usare StringBuilder in primo luogo ... – codekaizen

+0

@codekaizen, d'accordo! – eugeneK

+1

@codekaizer: No, l'ultimo è probabilmente altrettanto efficiente del riutilizzo della cosa. Il vero uso dell'SB è ciò che accade nel resto del ciclo. La lunghezza di –

2

Si c riutilizzare un oggetto StringBuilder (con .Clear() o .Length = 0) ma se si desidera ottimizzare si dovrebbe provare a stimare la lunghezza finale. Se questo aumenta un po 'ogni iterazione, il ri-suing potrebbe essere più lento (più mem) che crearne uno nuovo ogni volta.

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

} 

Così, mentre le risposte qui su come per farlo sono corrette, il miglior consiglio è non farlo. È una micro-ottimizzazione, e non hai bisogno di guadagni molto piccoli qui e non vuoi le (piccole) complicazioni extra. Potresti ottimizzare un po 'qui se la stringa risultante è molto grande, ma certamente non lo fai diventare un'abitudine.

+0

è otto al massimo, potrebbe essere inferiore. Quindi stai dicendo che se assegno la lunghezza predefinita non ho bisogno di sb.Length = 0 o creerà solo oggetti più piccoli e ridurrà il tempo? – eugeneK

+0

Se guardo quelle chiamate AppendFormat() la lunghezza sarà molto maggiore di otto. Ma sì, usa una buona stima per la lunghezza prevista e non provare a riutilizzarla in questo modo. –

+0

ho 8 metodi Append che dovrebbe essere la lunghezza o la lunghezza della più grande stringa aggiunta? – eugeneK

Problemi correlati