Gunakan saja
string.Join(",", yourCollection)
Dengan cara ini Anda tidak membutuhkan StringBuilder
dan loop.
Penambahan panjang tentang kasus asinkron. Pada 2019, bukan hal yang jarang terjadi ketika data datang secara tidak sinkron.
Jika data Anda berada dalam koleksi asinkron, tidak ada string.Join
pengambilan berlebihan IAsyncEnumerable<T>
. Tetapi mudah untuk membuatnya secara manual, meretas kode daristring.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;
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();
}
}
}
Jika data datang secara asinkron tetapi antarmukanya IAsyncEnumerable<T>
tidak didukung (seperti yang disebutkan di komentar SqlDataReader
), relatif mudah untuk menggabungkan data menjadi 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]);
}
dan gunakan itu:
Task<string> Stringify(SqlDataReader reader) =>
StringEx.JoinAsync(
", ",
ExtractData(reader).Select(x => $"{x.first} * {x.second} = {x.product}"));
Untuk menggunakan Select
, Anda harus menggunakan paket nuget System.Interactive.Async
. Di sini Anda dapat menemukan contoh kompilasi.
string.Join(",", yourCollection)
? Edit: ditambahkan sebagai jawaban.