C# Language
StringBuilder
サーチ…
StringBuilderの概要と使用方法
StringBuilder
は、通常の文字列とは異なり、変更可能な一連の文字を表します。多くの場合、既に作成した文字列を変更する必要がありますが、標準の文字列オブジェクトは変更できません。つまり、文字列が変更されるたびに、新しい文字列オブジェクトを作成し、コピーしてから再割り当てする必要があります。
string myString = "Apples";
mystring += " are my favorite fruit";
上記の例では、 myString
は最初は"Apples"
という値しか持っていません。しかし、私が「私の好きな果物」を連結すると、文字列クラスは内部的に何をする必要がありますか:
-
myString
の長さと追加する新しい文字列に等しい文字の新しい配列を作成します。 -
myString
すべての文字を新しい配列の先頭にコピーし、新しい文字列を配列の最後にコピーします。 - メモリ内に新しい文字列オブジェクトを作成し、それを
myString
再割り当てしmyString
。
単一の連結の場合、これは比較的簡単です。しかし、ループのように多くの追加操作を実行する必要がある場合はどうなりますか?
String myString = "";
for (int i = 0; i < 10000; i++)
myString += " "; // puts 10,000 spaces into our string
コピーとオブジェクトの作成が繰り返されるため、プログラムのパフォーマンスが大幅に低下します。代わりにStringBuilder
を使用することで、これを回避できます。
StringBuilder myStringBuilder = new StringBuilder();
for (int i = 0; i < 10000; i++)
myStringBuilder.Append(' ');
同じループが実行されると、プログラムの実行時間のパフォーマンスと速度は、通常の文字列を使用する場合よりも大幅に高速になります。 StringBuilder
通常の文字列に戻すには、単にStringBuilder
ToString()
メソッドを呼び出すだけです。
しかし、これはStringBuilder
が持つ唯一の最適化ではありません。機能をさらに最適化するために、パフォーマンスを向上させるその他のプロパティを利用できます。
StringBuilder sb = new StringBuilder(10000); // initializes the capacity to 10000
StringBuilder
長さを事前に知っていれば、そのサイズを事前に指定することができます。これにより、内部で持っている文字配列のサイズを変更する必要がなくなります。
sb.Append('k', 2000);
追加のためにStringBuilder
を使用するのは文字列よりもはるかに高速ですが、単一の文字を何度も追加するだけであれば、さらに高速に実行できます。
文字列の作成が完了したら、 StringBuilder
ToString()
メソッドを使用して基本string
に変換できstring
。これは、 StringBuilder
クラスがstring
から継承しないため、しばしば必要です。
たとえば、 StringBuilder
を使用してstring
を作成する方法を次に示します。
string RepeatCharacterTimes(char character, int times)
{
StringBuilder builder = new StringBuilder("");
for (int counter = 0; counter < times; counter++)
{
//Append one instance of the character to the StringBuilder.
builder.Append(character);
}
//Convert the result to string and return it.
return builder.ToString();
}
結論として、 StringBuilder
は、文字列の多くの変更をパフォーマンスを念頭に置いて行う必要がある場合に、文字列の代わりに使用する必要があります。
StringBuilderを使用して多数のレコードから文字列を作成する
public string GetCustomerNamesCsv()
{
List<CustomerData> customerDataRecords = GetCustomerData(); // Returns a large number of records, say, 10000+
StringBuilder customerNamesCsv = new StringBuilder();
foreach (CustomerData record in customerDataRecords)
{
customerNamesCsv
.Append(record.LastName)
.Append(',')
.Append(record.FirstName)
.Append(Environment.NewLine);
}
return customerNamesCsv.ToString();
}