web-dev-qa-db-ja.com

stringbuilderで構築された文字列から最後の文字を削除する最良の方法

私は次のものを持っています

data.AppendFormat("{0},",dataToAppend);

これの問題は、ループで使用しているため、試行中のコンマがあることです。末尾のコンマを削除する最良の方法は何ですか?

データを部分文字列の文字列に変更する必要がありますか?

74
Wesley Skeen

最も単純で最も効率的な方法は、次のコマンドを実行することです。

data.Length--;

これを行うことにより、ポインター(つまり、最後のインデックス)を1文字だけ戻しますが、オブジェクトの可変性は変更しません。実際、StringBuilderをクリアするにはLengthを使用するのが最適です(ただし、実装は次のようになっているため、明確にするために実際にはClear()メソッドを使用します)。

data.Length = 0;

繰り返しますが、それは割り当てテーブルを変更しないからです。私はもうこれらのバイトを認識したくないと言っているように考えてください。これで、ToString()を呼び出した場合でも、Lengthを超えたものは認識されません。これは変更可能なオブジェクトであり、ユーザーが提供するスペースよりも多くのスペースを割り当て、単純にこの方法で構築されます。

190
Mike Perrenoud

ただ使う

string.Join(",", yourCollection)

この方法では、StringBuilderとループは必要ありません。

36
Vlad

ループの後、次を使用します。

.TrimEnd(',')

または単にに変更します

string commaSeparatedList = input.Aggregate((a, x) => a + ", " + x)
10
Sam Leach

これはどう..

string str = "The quick brown fox jumps over the lazy dog,";
StringBuilder sb = new StringBuilder(str);
sb.Remove(str.Length - 1, 1);
8
Pankaj

Stringbuilderの長さを操作することを好みます。

data.Length = data.Length - 1;
7
bastos.sergio

ループアルゴリズムを変更することをお勧めします。

  • アイテムの後ではなく、前にコンマを追加します
  • Falseで始まるブール変数を使用し、最初のコンマを抑制します
  • テスト後にこのブール変数をtrueに設定します
3
Eugen Rieck

string.Joinメソッドを使用して、アイテムのコレクションをコンマ区切りの文字列に変換する必要があります。文字列が(不必要な中間文字列なしで)効率的に構築されるのと同様に、先頭または末尾のコンマがないことを保証します。

3
Servy

はい、ループが完了したら文字列に変換します:

String str = data.ToString().TrimEnd(',');
2
DonBoitnott

2つのオプションがあります。最初の方法は非常に使いやすいRemoveメソッドで、非常に効果的です。 2番目の方法は、ToStringを開始インデックスと終了インデックスと共に使用することです( MSDN documentation

2
Piotr Stapp

同様のSOここの質問。

StringBuilder拡張メソッドを使用するのが好きでした。

RemoveLastメソッド

2
MrB

最も簡単な方法は、Join()メソッドを使用することです。

public static void Trail()
{
    var list = new List<string> { "lala", "lulu", "lele" };
    var data = string.Join(",", list);
}

本当にStringBuilderが必要な場合は、ループの後に終了コンマをトリムします。

data.ToString().TrimEnd(',');
1
studert