Chỉ dùng
string.Join(",", yourCollection)
Bằng cách này, bạn không cần StringBuilder
và vòng lặp.
Bổ sung dài về trường hợp không đồng bộ. Kể từ năm 2019, đây không phải là một thiết lập hiếm khi dữ liệu đến không đồng bộ.
Trong trường hợp dữ liệu của bạn đang được thu thập không đồng bộ, không có string.Join
quá tải IAsyncEnumerable<T>
. Nhưng thật dễ dàng để tạo một cái theo cách thủ công, lấy mã 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();
}
}
}
Nếu dữ liệu đến không đồng bộ nhưng giao diện IAsyncEnumerable<T>
không được hỗ trợ (như được đề cập trong nhận xét SqlDataReader
), thì việc bọc dữ liệu thành mộtIAsyncEnumerable<T>
:
async IAsyncEnumerable<(object first, object second, object product)> ExtractData(
SqlDataReader reader)
{
while (await reader.ReadAsync())
yield return (reader[0], reader[1], reader[2]);
}
và sử dụng nó:
Task<string> Stringify(SqlDataReader reader) =>
StringEx.JoinAsync(
", ",
ExtractData(reader).Select(x => $"{x.first} * {x.second} = {x.product}"));
Để sử dụng Select
, bạn sẽ cần sử dụng gói nuget System.Interactive.Async
. Ở đây bạn có thể tìm thấy một ví dụ có thể tổng hợp được.
string.Join(",", yourCollection)
? Chỉnh sửa: được thêm vào dưới dạng câu trả lời.