महज प्रयोग करें
string.Join(",", yourCollection)
इस तरह से आपको StringBuilder
और लूप की आवश्यकता नहीं है ।
Async केस के बारे में लंबा जोड़। 2019 तक, यह एक दुर्लभ सेटअप नहीं है जब डेटा अतुल्यकालिक रूप से आ रहे हैं।
यदि आपका डेटा async संग्रह में है, तो कोई 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
, आपको नगेट पैकेज का उपयोग करना होगा System.Interactive.Async
। यहां आप एक उदाहरण योग्य उदाहरण पा सकते हैं।
string.Join(",", yourCollection)
? संपादित करें: उत्तर के रूप में जोड़ा गया।