Benutz einfach
string.Join(",", yourCollection)
Auf diese Weise benötigen Sie die StringBuilder
und die Schleife nicht.
Langer Zusatz zum asynchronen Fall. Ab 2019 ist es keine seltene Einrichtung, wenn die Daten asynchron kommen.
Wenn sich Ihre Daten in einer asynchronen Sammlung befinden, erfolgt keine string.Join
Überlastung IAsyncEnumerable<T>
. Es ist jedoch einfach, einen manuell zu erstellen und den Code zustring.Join
hacken von :
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();
}
}
}
Wenn die Daten asynchron kommen, die Schnittstelle IAsyncEnumerable<T>
jedoch nicht unterstützt wird (wie in den Kommentaren erwähnt SqlDataReader
), ist es relativ einfach, die Daten in Folgendes zu verpacken 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]);
}
und benutze es:
Task<string> Stringify(SqlDataReader reader) =>
StringEx.JoinAsync(
", ",
ExtractData(reader).Select(x => $"{x.first} * {x.second} = {x.product}"));
Um verwenden zu können Select
, müssen Sie das Nuget-Paket verwenden System.Interactive.Async
. Hier finden Sie ein kompilierbares Beispiel.
string.Join(",", yourCollection)
? Bearbeiten: als Antwort hinzugefügt.