StringBuilder:最終的な文字列を取得する方法は?
-
03-07-2019 - |
質問
誰かがStringBuilderで文字列を連結する方が速いと私に言った。コードを変更しましたが、最終的なビルド文字列を取得するためのプロパティまたはメソッドが表示されません。
文字列を取得するにはどうすればよいですか
解決
.ToString()
を使用して、 StringBuilder
から String
を取得できます。
他のヒント
「文字列と文字列ビルダーを連結する方が速い」と言うとき、これは、繰り返し(繰り返し-繰り返し)に連結している場合にのみ当てはまります同じオブジェクト。
2つの文字列を連結し、その結果をすぐに string
として処理する場合、 StringBuilder
を使用しても意味がありません。
私はJon Skeetのこの素晴らしい記事を見つけました: http:// www。 yoda.arachsys.com/csharp/stringbuilder.html
StringBuilder
を使用している場合、結果の string
を取得するには、 ToString()
を呼び出すだけです(当然)。
StringBuilderを使用して処理を完了したら、ToStringメソッドを使用して最終結果を返します。
MSDNから:
using System;
using System.Text;
public sealed class App
{
static void Main()
{
// Create a StringBuilder that expects to hold 50 characters.
// Initialize the StringBuilder with "ABC".
StringBuilder sb = new StringBuilder("ABC", 50);
// Append three characters (D, E, and F) to the end of the StringBuilder.
sb.Append(new char[] { 'D', 'E', 'F' });
// Append a format string to the end of the StringBuilder.
sb.AppendFormat("GHI{0}{1}", 'J', 'k');
// Display the number of characters in the StringBuilder and its string.
Console.WriteLine("{0} chars: {1}", sb.Length, sb.ToString());
// Insert a string at the beginning of the StringBuilder.
sb.Insert(0, "Alphabet: ");
// Replace all lowercase k's with uppercase K's.
sb.Replace('k', 'K');
// Display the number of characters in the StringBuilder and its string.
Console.WriteLine("{0} chars: {1}", sb.Length, sb.ToString());
}
}
// This code produces the following output.
//
// 11 chars: ABCDEFGHIJk
// 21 chars: Alphabet: ABCDEFGHIJK
単に高速化する必要はないかもしれませんが、メモリフットプリントが確実に向上することを捨てたいと思います。これは、.NETでは文字列が不変であり、文字列を変更するたびに新しい文字列が作成されるためです。
高速/高メモリであることについて:
Javaでこの問題を調査しましたが、.NETも同様に賢いと思います。
Stringの実装は非常に印象的です。
Stringオブジェクトは" length"を追跡しますおよび「共有」 (文字列を保持する配列の長さとは無関係)
次のようなもの
String a = "abc" + "def" + "ghi";
(コンパイラ/ランタイムによって)次のように実装できます。
- Extend the array holding "abc" by 6 additional spaces. - Copy def in right after abc - copy ghi in after def. - give a pointer to the "abc" string to a - leave abc's length at 3, set a's length to 9 - set the shared flag in both.
ほとんどの文字列は短命であるため、多くの場合、これにより非常に効率的なコードが作成されます。 絶対に効率的ではない場合は、ループ内の文字列に追加する場合、またはコードが次のような場合です:
a = "abc";
a = a + "def";
a += "ghi";
この場合、StringBuilderコンストラクトを使用する方がはるかに優れています。
私のポイントは、あなたが何をしているのかを絶対に確信していない限り、最適化するときは常に注意する必要があるということです。できるだけ読みやすい方法でコーディングし、コンパイラを考え抜かないでください。
文字列のソースコードを見る前に、文字列をいじり、文字列ビルダーをキャッシュ/再利用し、速度をテストするのに3日間無駄にしました。それから私は自分が何をしていたのか本当にわからなかったのか説明しなければならなかった。
連結は高速ではありません-smaclellが指摘したように、問題は、既存のデータの追加の割り当てと再コピーを強制する不変の文字列です。
「a」+「b」+「c」文字列ビルダーで行うのは速くありませんが、中間文字列で繰り返される連結は、連結の数が次のように大きくなるにつれて速くなります:
x =" a&quot ;; x + =" b&quot ;; x + =" c&quot ;; ...