2010-07-12 3 views
18

J'ai une boucle où je crée une certaine valeur de chaîne en fonction de certaines conditions. J'ai placé l'objet StringBuilder en dehors de la boucle et chaque fois que j'ai une nouvelle ligne dans la boucle, j'ai besoin d'effacer les valeurs ajoutées de StringBuilder pour cette ligne.Comment rendre StringBuilder vide à nouveau dans .NET 3.5?

Comment les supprimer?

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

Code avec réponse acceptée;

+0

Quand voulez-vous faire l'effacement pendant la boucle ou après qu'elle a fini? –

+0

pouvez-vous montrer du code, il semble que vous voulez seulement garder la dernière valeur. –

Répondre

47

Vous pouvez simplement;

sb.Length = 0; 
+0

exactement ce dont j'avais besoin. J'ai presque utilisé sb.Remove() qui complique le problème. – eugeneK

+2

vous pouvez utiliser ceci: sb.Remove (0, sb.Length); – AminM

+2

Ce n'est pas la meilleure idée lorsque vous travaillez avec de très longues chaînes. Cela peut provoquer une exception de MOO. Plus d'explications sont fournies sur 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(); est ce que vous voulez.

+2

.NET 3.5 Désolé! – eugeneK

+9

Ceci est uniquement disponible dans .Net 4. .Net <= 3.5 doit utiliser 'sb.Length = 0;' – codekaizen

4

Définir la longueur à 0 ou à .Net 4 Je crois que vous pouvez appeler la nouvelle méthode Clear().

2

En supposant que vous définissez votre StringBuilder comme ceci: StringBuilder sb = new StringBuilder();

Vous pouvez effectuer les opérations suivantes:

Appelez la méthode claire:

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

Régler la longueur à zéro:

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

ensemble à un nouvel objet:

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

Ce dernier va plutôt à l'encontre de l'objectif d'utiliser StringBuilder en premier lieu ... – codekaizen

+0

@codekaizen, convenu! – eugeneK

+1

@codekaizer: Non, ce dernier est probablement aussi efficace que de réutiliser la chose. L'utilisation réelle du SB est ce qui se passe dans le reste de la boucle. –

2

Vous avez c une réutilisation d'un StringBuilder (avec .Clear() ou .Length = 0) mais si vous voulez vraiment optimiser, vous devriez essayer d'estimer la longueur finale. Si cela augmente un peu à chaque itération, la répétition pourrait être plus lente (plus de mem) que de créer une nouvelle à chaque fois.

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

} 

Ainsi, alors que les réponses ici à propos comment pour le faire sont corrects, le meilleur conseil est pas à le faire. C'est une micro-optimisation, et vous n'avez pas besoin des très petits gains ici et vous ne voulez pas les (petites) complications supplémentaires. Vous pouvez optimiser un peu ici si la chaîne résultante est très grande mais certainement ne pas en faire une habitude.

+0

longueur est de huit au maximum, pourrait être inférieur. Donc, vous dites que si j'attribue une longueur par défaut, je n'ai pas besoin de sb.Length = 0 ou cela créera simplement un objet plus petit et réduira le temps? – eugeneK

+0

Si je regarde ces AppendFormat() appelez votre longueur sera beaucoup plus grande que huit. Mais oui, utilisez une bonne estimation pour la durée attendue et n'essayez pas de réutiliser comme ça. –

+0

J'ai 8 méthodes Append, il est censé être la longueur ou la longueur de la plus grande chaîne en annexe? – eugeneK