Search code examples
c#linqlambdastringbuilder

LINQ to append to a StringBuilder from a String[]


I've got a String array that I'm wanting to add to a string builder by way of LINQ.

What I'm basically trying to say is "For each item in this array, append a line to this StringBuilder".

I can do this quite easily using a foreach loop however the following code doesn't seem to do anything. What am I missing?

stringArray.Select(x => stringBuilder.AppendLine(x));

Where as this works:

foreach(String item in stringArray)
{
  stringBuilder.AppendLine(item);
}

Solution

  • If you insist on doing it in a LINQy way:

    StringBuilder builder = StringArray.Aggregate(
                                new StringBuilder(),
                                (sb, s) => sb.AppendLine(s)
                            );
    

    Alternatively, as Luke pointed out in a comment on another post, you could say

    Array.ForEach(StringArray, s => stringBuilder.AppendLine(s));
    

    The reason that Select does not work is because Select is for projecting and creating an IEnumerable of the projection. So the line of code

    StringArray.Select(s => stringBuilder.AppendLine(s))
    

    does not iterate over the StringArray calling stringBuilder.AppendLine(s) on each iteration. Rather, it creates an IEnumerable<StringBuilder> that can be enumerated over.

    I suppose that you could say

    var e = stringArray.Select(x => stringBuilder.AppendLine(x));
    StringBuilder sb = e.Last();
    Console.WriteLine(sb.ToString());
    

    but that is really hideous.