Existe-t-il un moyen d'ajouter deux générateurs de chaînes? Et si c'est le cas - est-ce que cela fonctionne mieux que d'ajouter une chaîne à un StringBuilder?
Juste comme ça....
StringBuilder sb = new StringBuilder();
StringBuilder sb1 = new StringBuilder();
sb.Append(sb1.ToString());
Je sais que c'est trois ans plus tard, mais le .NET 4 StringBuilder
se comporte de toute façon différemment.
Néanmoins, cela revient toujours à "que voulez-vous faire?" Recherchez-vous simplement la manière la plus performante d'ajouter deux StringBuilders
et de continuer avec ce dernier résultat? Ou prévoyez-vous de continuer à travailler avec la valeur tampon existante du StringBuilder
ajouté?
Pour les premiers, et toujours en .NET 4,
frontStringBuilder.Append(backStringBuilder);
est le meilleur.
Pour ce dernier scénario dans .NET 2/3.5,
frontStringBuilder.Append(backStringBuilder.ToString(0, backStringBuilder.Length));
est le meilleur (et ne nuira pas aux performances dans .NET 4).
Cela se fera sans allocations
StringBuilder sb = new StringBuilder("aaaa");
StringBuilder second = new StringBuilder("bbbbb");
sb.EnsureCapacity(sb.Length + second.Length);
for (int i = 0; i < second.Length; i++)
{
sb.Append(second[i]);
}
Vous n'avez pas besoin d'appeler .ToString (). Vous devez simplement les ajouter les uns aux autres. C'est tout. Ce sera mieux contre l'appel direct .ToString () pour la raison suivante:
1) StringBuilder n'a pas de constructeur avec StringBuilder comme paramètre, chaîne, int/chaîne, etc. StringBuilder remplaçant .ToString () et par conséquent:
StringBuilder sb1 = new StringBuilder("1");
sb1.Append(new StringBuilder("2"));
Console.WriteLine(sb1);
ce code appellera automatiquement la version remplacée de .ToString (). La sortie sera "12";
2) Si StringBuilder sera ajouté en tant que paramètre entrant au constructeur de StringBuilder dans les prochaines versions du framework, votre code sera clair et prêt à être ajouté correctement sans refactorisation.
Bonne journée!
Simplement comme ça:
firstStringBuilder.Append(secondStringBuilder.ToString());
Si StringBuilder est volumineux, cela minimisera les allocations de chaînes (surtout si vous pouvez fournir un tampon de char réutilisable):
public static void CopyTo(this StringBuilder source, StringBuilder dest)
{
char[] buffer = new char[Math.Min(source.Length, 1024)];
CopyTo(source, dest, buffer);
}
public static void CopyTo(this StringBuilder source, StringBuilder dest, char[] buffer)
{
dest.EnsureCapacity(dest.Length + source.Length);
for (int i = 0; i < source.Length; i += buffer.Length)
{
int charCount = Math.Min(source.Length - i, buffer.Length);
source.CopyTo(i, buffer, 0, charCount);
dest.Append(buffer, 0, charCount);
}
}