ChatGPT解决这个技术问题 Extra ChatGPT

C# List<string> to string with delimiter

Is there a function in C# to quickly convert some collection to string and separate values with delimiter?

For example:

List<string> names --> string names_together = "John, Anna, Monica"


D
Demodave

You can use String.Join. If you have a List<string> then you can call ToArray first:

List<string> names = new List<string>() { "John", "Anna", "Monica" };
var result = String.Join(", ", names.ToArray());

In .NET 4 you don't need the ToArray anymore, since there is an overload of String.Join that takes an IEnumerable<string>.

Results:

John, Anna, Monica


B
Bob

You can also do this with linq if you'd like

var names = new List<string>() { "John", "Anna", "Monica" };
var joinedNames = names.Aggregate((a, b) => a + ", " + b);

Although I prefer the non-linq syntax in Quartermeister's answer and I think Aggregate might perform slower (probably more string concatenation operations).


Thanks for the fast replies, both works fine. You're right I did a small performance measurement using Stopwatch class and the linq-way is much slower: String.Join(", ", names.ToArray()); --> took 18 ticks Aggregate((a, b) => a + ", " + b) --> took 736 ticks
Yeah I think Aggregate is better for Math type operations. With strings this operation it is similar to for each ing and just appending to a string which is very slow in inefficient because you are creating a new string for each item that exists in the list.
Note that Aggregate without a seed value will throw an InvalidOperationException if the container is empty. Use the seeded version Aggregate(seed, func) to avoid error handling code or conditional checks. String.Join does not throw on empty so no seed or extra code is required... plus it doesn't require Linq and the syntax is a little clearer.
Aggregate in the example above may work faster if you'll use StringBuilder. Using '+' to perform multiple concatenation is not recommended. See Remarks section in here (msdn.microsoft.com/en-us/library/…)
I've found that StringBuilder.AppendJoin() looks like exactly what the op need: var names = new List<string>() { "John", "Anna", "Monica" }; string joinedNames = new StringBuilder().AppendJoin(", ", names); It's roughly same as string.Join(), I've not preformance-tested this. In case you desperately need a Linq form, without aggregation: var names = new List<string>() { "John", "Anna", "Monica" }; var joinedNames = new System.Text.StringBuilder(); names.ForEach(a => joinedNames.Append((joinedNames.Length > 0 ?", " : "") + a)); //joinedNames.ToString();