19


1

.NET 3.5でStringBuilderを再び空にする方法は?

特定の条件に基づいて文字列値を作成するループがあります。 StringBuilderオブジェクトをループの外側に配置しました。ループに新しい行があるたびに、この行のStringBuilderの追加値をクリアする必要があります。

それらをクリアするにはどうすればよいですか?

        StringBuilder sb = new StringBuilder();

        foreach (DataRow row in recipientsList.Rows)
        {
            sb.Length = 0;
            sb.Append("");
            if (row["needsToActivate"] == "1")
            {
                sb.AppendFormat("{0}", getUsersWithoutActivationTemplate());
            }
            if (row["needsToEnterSite"] == "1")
            {
                sb.AppendFormat("{0}", getUsersWithoutEnteringWebsiteForTwoWeeksTemplate());
            }
            if (row["needsPicture"] == "1")
            {
                sb.AppendFormat("{0}", getUsersWithoutPicturesTemplate());
            }
            if (row["needsText"] == "1")
            {
                sb.AppendFormat("{0}", getUsersWithoutTextTemplate());
            }
            if (row["needsCharacteristic"] == "1")
            {
                sb.AppendFormat("{0}", getUsersWithoutCharateristicsTemplate());
            }
            if (row["needsHobby"] == "1")
            {
                sb.AppendFormat("{0}", getUsersWithoutHobbiesTemplate());
            }
            sb.Append("");
}

受け入れられた回答を含むコード。

5 Answer


49


簡単にできます。

sb.Length = 0;


12


`StringBuilder.Clear();`はあなたが望むものです。


4


Lengthを0または.Net 4に設定します。新しいClear()メソッドを呼び出すことができると思います。


3


次のようにStringBuilderを定義するとします。StringBuilder sb = new StringBuilder();

次のいずれかを実行できます。

Clearメソッドを呼び出します。

for (int i = 0; i < 100; i++)
{
    sb.Clear();
    .. your code here ..
}

長さをゼロに設定します。

for (int i = 0; i < 100; i++)
{
    sb.Length = 0;
    .. your code here ..
}

新しいオブジェクトに設定します。

for (int i = 0; i < 100; i++)
{
    sb = new StringBuilder();
    .. your code here ..
}


3


StringBuilderを(.Clear()または.Length = 0で)再利用できますが、本当に最適化する場合は、最終的な長さを見積もってください。 これが反復ごとに少し大きくなると、再利用は毎回新しいものを作成するよりも遅くなる可能性があります(より多くのmemを使用します)。

foreach (DataRow row in recipientsList.Rows)
{
    int estimatedLength = 5000; // maybe a calculation based on row-data
    StringBuilder sb = new StringBuilder(estimatedLength);
    ....

}

'' '' '

したがって、ここでの_how_についての答えは正しいですが、最善のアドバイスは_not_しないことです_。 これは微小な最適化であり、ここで非常に小さなゲインを必要とせず、(小さな)余分な複雑さを望んでいません。 結果の文字列が非常に大きい場合、ここで少し最適化できますが、これを習慣にしないでください。