2011-06-23 16 views
35

Czy istnieje sposób dołączenia dwóch konstruktorów stringów? A jeśli tak - czy działa lepiej niż dołączanie ciąg do StringBuilder?Jak dołączyć dwa łańcuchy znaków?

+1

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

+1

Myślę, że to pytanie nie zostało nazwane tak, jak powinno być! Zmieniono – Burimi

+0

. Mój zły –

Odpowiedz

18

tak po prostu ....

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

To jest dołączanie ciąg do sb.Myślałem, aby dołączyć do sb, aby uniknąć uszczelniania sb na ciąg –

-7

Można to zrobić,

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

Źródło MSDN.

6

prostu jako że:

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

to zrobi to bez alokacji

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

To jest warte rozważenia, ale widząc jak wiesz "second.Length" wcześniej, powinieneś najpierw wywołać 'sb.EnsureCapacity (sb.Length + second.Length)'. –

19

wiem, że to trzy lata później, ale .NET 4 StringBuilder zachowuje się inaczej w każdym razie.

Mimo to nadal wraca do "co chcesz zrobić?" Poszukujesz po prostu najbardziej wydajnego sposobu dołączania dwóch StringBuilders i kontynuowania tego samego rezultatu? A może spodziewasz się kontynuować pracę z istniejącą buforowaną wartością dołączonego StringBuilder?

Dla tych pierwszych, i zawsze w .NET 4,

frontStringBuilder.Append(backStringBuilder); 

jest najlepszy.

Na tym drugim scenariuszu w .NET 2/3.5,

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

jest najlepszy (i nie będzie bolało wydajność w .NET 4).

+0

Bardzo jasna odpowiedź. Pomyślałem, że warto to dodać. AppendLine() NIE zapewnia takiej samej elastyczności, na wypadek gdyby ktoś się zastanawiał. –

+0

@CharlesRobertoCanato Nie jestem pewien co masz na myśli: '.AppendLine' jest zaimplementowany jako' .Append (string) ', po którym następuje' .Append (NewLine) 'dla obu .NET 2.0/3.5 i 4, co oznacza, że ​​oba powyższe scenariusze są takie same. –

+0

Przepraszam, @MarkHurd Nie byłam wystarczająco jasna: chodzi mi o to, że '.ApppendLine' jest naprawdę zaimplementowana w opisany sposób, akceptuje tylko' String' jako parametr w dowolnej wersji .NET. Tak więc, nawet w .NET 4, nie można po prostu zrobić '.AppendLine (backStringBuilder)' - co miałem na myśli z "brakiem elastyczności". Nie ma problemu, tylko notatkę - to tylko dodatkowe wywołanie metody. –

9

Nie trzeba dzwonić .ToString(). Powinieneś po prostu dołączyć jeden do drugiego. To wszystko. Będzie lepiej przeciwko bezpośredniemu wywoływaniu .ToString() z następnego powodu:

1) StringBuilder nie ma konstruktora z StringBuilder jako param, ciąg, int/string itp. Nadpisanie StringBuilder .ToString() i jako wynik:

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

ten kod wywoła automatycznie zastąpioną wersję .ToString(). Wyjście będzie "12";

2) Jeśli StringBuilder zostanie dodany jako parametr przychodzący do konstruktorów StringBuilder w kolejnych wersjach framework, twój kod będzie jasny i gotowy do poprawnego dołączania bez żadnego refaktoryzacji.

Miłego dnia!

+1

Świetna sugestia i czyste, zrozumiałe kodowanie –

1

Jeśli StringBuilder jest duża, to zminimalizuje String-przydziały (zwłaszcza jeśli można zapewnić wielokrotnego użytku Char-bufor):

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); 
     } 
    } 
Powiązane problemy