私は以下を持っています
data.AppendFormat("{0},",dataToAppend);
これの問題は、それをループで使用していて、試行錯誤のカンマがあることです。末尾のコンマを削除する最良の方法は何ですか?
データを文字列、部分文字列に変更する必要がありますか?
私は以下を持っています
data.AppendFormat("{0},",dataToAppend);
これの問題は、それをループで使用していて、試行錯誤のカンマがあることです。末尾のコンマを削除する最良の方法は何ですか?
データを文字列、部分文字列に変更する必要がありますか?
回答:
最も簡単で最も効率的な方法は、次のコマンドを実行することです。
data.Length--;
これを行うことにより、ポインタ(つまり、最後のインデックス)を1文字戻しますが、オブジェクトの変更可能性は変更しません。実際、aのクリアStringBuilder
はLength
も同様にです(ただしClear()
、実装がどのようなものであるかを明確にするために、実際にはメソッドを使用してください)。
data.Length = 0;
割り当てテーブルを変更しないためです。このようなバイトを認識したくないというようなことを考えてみてください。さて、を呼び出してもToString()
、それ以降は何も認識しLength
ません。これは、提供するものより多くのスペースを割り当てる可変オブジェクトであり、この方法で単純に構築されます。
data.Length = 0;
:それはまさにStringBuilder.Clear
それが行うことなのでStringBuilder.Clear
、意図を明確にするために使用することが望ましいです。
Clear()
しているのかをもっと明確に述べるべきだったが、面白いことだ。これがメソッドの最初の行ですClear()
。しかし、インターフェースが実際にを発行することを知っていましたかreturn this;
。今、それは私を殺すものです。Length = 0
すでに持っている参照の変更を設定し、なぜ自分自身を返すのですか?
Append
自分自身も返します。
使うだけ
string.Join(",", yourCollection)
この方法StringBuilder
では、ループは必要ありません。
非同期のケースに関する長い追加。2019年の時点では、データが非同期で送信される場合のセットアップはまれではありません。
データが非同期コレクションにある場合、string.Join
オーバーロードの取得はありませんIAsyncEnumerable<T>
。しかし、手動で作成して、次のコードをstring.Join
ハッキングするのは簡単です。
public static class StringEx
{
public static async Task<string> JoinAsync<T>(string separator, IAsyncEnumerable<T> seq)
{
if (seq == null)
throw new ArgumentNullException(nameof(seq));
await using (var en = seq.GetAsyncEnumerator())
{
if (!await en.MoveNextAsync())
return string.Empty;
string firstString = en.Current?.ToString();
if (!await en.MoveNextAsync())
return firstString ?? string.Empty;
// Null separator and values are handled by the StringBuilder
var sb = new StringBuilder(256);
sb.Append(firstString);
do
{
var currentValue = en.Current;
sb.Append(separator);
if (currentValue != null)
sb.Append(currentValue);
}
while (await en.MoveNextAsync());
return sb.ToString();
}
}
}
データが非同期で送られてくるが、インターフェースIAsyncEnumerable<T>
がサポートされていない場合(コメントで述べたようにSqlDataReader
)、データをにラップするのは比較的簡単IAsyncEnumerable<T>
です:
async IAsyncEnumerable<(object first, object second, object product)> ExtractData(
SqlDataReader reader)
{
while (await reader.ReadAsync())
yield return (reader[0], reader[1], reader[2]);
}
そしてそれを使う:
Task<string> Stringify(SqlDataReader reader) =>
StringEx.JoinAsync(
", ",
ExtractData(reader).Select(x => $"{x.first} * {x.second} = {x.product}"));
を使用するにはSelect
、nugetパッケージを使用する必要がありますSystem.Interactive.Async
。ここにコンパイル可能な例があります。
string.Join(",", yourCollection)
まだ,
終わりがあります。したがって、上記のIE string.Join(",", yourCollection)
は非効率的であり、それ自体では削除されません。
ループの後、次を使用します。
.TrimEnd(',')
または単にに変更
string commaSeparatedList = input.Aggregate((a, x) => a + ", " + x)
string.Join(",", input)
私は文字列ビルダーの長さを操作することを好みます:
data.Length = data.Length - 1;
data.Length--
か--data.Length
?
--
か、++
あなたは使用することができるdata.Length -= 1
けれども、またはこの答えはあまりにも動作します。
はい、ループが完了したら、文字列に変換します。
String str = data.ToString().TrimEnd(',');
2つのオプションがあります。最初のものは非常に簡単な使用Remove
方法で、非常に効果的です。2番目の方法はToString
、開始インデックスと終了インデックスで使用することです(MSDNドキュメント)
最も簡単な方法は、Join()メソッドを使用することです。
public static void Trail()
{
var list = new List<string> { "lala", "lulu", "lele" };
var data = string.Join(",", list);
}
StringBuilderが本当に必要な場合は、ループの後に終了コンマをトリミングします。
data.ToString().TrimEnd(',');
data.ToString().TrimEnd(',');
非効率的
string.Join(",", yourCollection)
?編集:回答として追加されました。