2011-06-23 13 views
35

C'è un modo per aggiungere due builder di stringhe? E se sì - funziona meglio di aggiungere una stringa a un StringBuilder?Come aggiungere due stringBuilder?

+1

stringBuilder1.Append (stringBuilder2.ToString()); http://www.dotnetperls.com/stringbuilder-1 – Joe

+1

Penso che questa domanda non sia nominata come dovrebbe essere! – Burimi

+0

modificato. Il mio male –

risposta

18

Proprio così ....

 StringBuilder sb = new StringBuilder(); 
     StringBuilder sb1 = new StringBuilder(); 
     sb.Append(sb1.ToString()); 
+17

Questo è l'accodamento di una stringa a uno sb.Ho pensato di aggiungere a sb per evitare di sigillare sb alla stringa –

-7

Si potrebbe fare che,

bool flag = false; 
System.Text.StringBuilder sb = new System.Text.StringBuilder(); 
sb.Append("The value of the flag is ").Append(flag).Append("."); 

Fonte MSDN.

6

semplicemente come che:

firstStringBuilder.Append(secondStringBuilder.ToString()); 
16

Questo lo farà senza allocazioni

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]); 
} 
+3

Questo vale la pena prendere in considerazione, ma visto che conosci 'second.Length' in anticipo, dovresti prima chiamare' sb.EnsureCapacity (sb.Length + second.Length) '. –

19

So che questo è di tre anni più tardi, ma il .NET 4 StringBuilder si comporta in modo diverso in ogni caso.

Tuttavia, torna ancora a "cosa vuoi fare?" Stai cercando semplicemente il modo più performante di aggiungere due StringBuilders e continuare con solo quest'ultimo risultato? O ti aspetti di continuare a lavorare con il valore di buffer esistente del StringBuilder aggiunto?

Per il primo, e sempre in .NET 4,

frontStringBuilder.Append(backStringBuilder); 

è meglio.

Per quest'ultimo scenario in NET 2/3.5,

frontStringBuilder.Append(backStringBuilder.ToString(0, backStringBuilder.Length)); 

è meglio (e non farà male le prestazioni in .NET 4).

+0

Risposta molto chiara. Ho pensato che valesse la pena aggiungere che. AppendLine() NON fornisce la stessa flessibilità, nel caso in cui qualcuno si chieda. –

+0

@CharlesRobertoCanato Non sono sicuro di cosa intendi: '.AppendLine' è implementato come' .Append (string) 'seguito da' .Append (NewLine) 'per entrambi .NET 2.0/3.5 e 4, il che significa che entrambi gli scenari sopra sono gli stessi. –

+0

Mi dispiace @MarkHurd I non era abbastanza chiaro: volevo dire che, sebbene '.ApppendLine' sia realmente implementato come descritto, accetta solo' String' come parametro in qualsiasi versione .NET. Quindi, anche in .NET 4, non si può semplicemente fare un '.AppendLine (backStringBuilder)' - cosa volevo dire con "mancanza di flessibilità". Non è un problema, solo una nota: è solo una chiamata al metodo in più, comunque. –

9

Non è necessario chiamare .ToString(). Dovresti semplicemente aggiungerne uno a un altro. È tutto. Chiama per la chiamata diretta .ToString() per il motivo successivo:

1) StringBuilder non ha costruttore con StringBuilder come parametro, stringa, int/stringa ecc. StringBuilder sovrascrive .ToString() e di conseguenza:

StringBuilder sb1 = new StringBuilder("1"); 
sb1.Append(new StringBuilder("2")); 
Console.WriteLine(sb1); 

tale codice richiamerà automaticamente la versione sovrascritta di .ToString(). L'uscita sarà "12";

2) Se StringBuilder verrà aggiunto come parametro in ingresso al costruttore StringBuilder nelle prossime versioni del framework, il codice sarà chiaro e pronto per l'aggiunta corretta senza alcun refactoring.

Buona giornata!

+1

Ottimo suggerimento e codice pulito e comprensibile –

1

Se lo StringBuilder è grande, allora questo sarà ridurre al minimo stringa-allocazioni (soprattutto se è possibile fornire un char-buffer riutilizzabile):

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