web-dev-qa-db-fra.com

Comment ajouter deux stringBuilders?

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?

45
Elad Benda

Juste comme ça....

StringBuilder sb = new StringBuilder();
StringBuilder sb1 = new StringBuilder();
sb.Append(sb1.ToString());
19
Gaurav Agrawal

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).

31
Mark Hurd

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]);
}
20
Ondrej Petrzilka

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!

10
Nigrimmist

Simplement comme ça:

firstStringBuilder.Append(secondStringBuilder.ToString());
6
Dummy01

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);
        }
    }
2
Rolf Kristensen