How it works
CSV is more than joining arbitrary strings with commas. A field containing a comma, quote, or newline must be quoted, and a quote inside a quoted field is represented by a doubled quote. The helper implements that export rule for one field and leaves ordinary fields unchanged. Joining the escaped fields then produces a valid row for these examples. Importing CSV requires a parser that understands quoted fields across separators and possibly across physical lines; string.Split is not an equivalent reader.
State the delimiter and newline conventions when another tool will consume the export, and test embedded quotes deliberately.
Add a field containing a newline and inspect the complete string. Explain why a reader must track quoted-field state instead of treating every physical newline as a new record.
A working example
using System;
using System.Linq;
using System.Collections.Generic;
using System.Globalization;
using System.Text;
using System.Text.Json;
using System.Threading;
using System.Threading.Tasks;
var row = new[] { "Ada", "books, maps", "say \"hi\"" };
Console.WriteLine(string.Join(",", row.Select(Escape)));
string Escape(string value) => value.IndexOfAny(new[] { ',', '"', '\r', '\n' }) >= 0 ? "\"" + value.Replace("\"", "\"\"") + "\"" : value;
Expected output
Ada,"books, maps","say ""hi"""
Escape each field before joining; splitting on commas cannot read every CSV row.