8

What's the best way to create multi-line string in C#?

I know the following methods:

Using StringBuilder

var result = new StringBuilder().AppendLine("one").AppenLine("two").ToString()

looks too verbose.

Using @

      var result = @"one
two"

looks ugly and badly formatted.

Do you know better ways?

1
  • If you're really going for "literals only", or just have some basic replacements to make, and have a lot of text (for example, usage messages for console applications come to mind), you could also use a "template" plain-text embedded resource. Commented Oct 6, 2009 at 11:42

8 Answers 8

24

What about this:

var result = string.Join(Environment.NewLine, new string[]{ 
    "one",
    "two" 
});

It's a bit painful and possibly an overkill, but it gives the possibility to preserve the lines separation in your code.
To improve things a little, you could use an helper method:

static string MultiLine(params string[] args) {
    return string.Join(Environment.NewLine, args);
}

static void Main(string[] args) {
    var result = MultiLine( 
        "one",
        "two" 
    );
}
Sign up to request clarification or add additional context in comments.

2 Comments

Not too bad. I think I'll create extension method and use like this: new[] { "One", "Two" }.Join(Environment.NewLine) or even create a class and use like this: StringHelper.JoinLines("one", "two")
I had thought about the extension method, but in the end I think I prefer the "plain" old-style utility...
12

What about this?

var result = "one\ntwo";

If you're fussy about OS-specific line endings, use Format:

var result = String.Format("one{0}two", Environment.NewLine);

(Well, “fussy” isn’t the right word: when dealing with text files, OS-specific line endings are often desired or even necessary, when dealing with legacy software.)

1 Comment

Nice but I'd prefer to separate lines with <", "> rather than with <{0}>. One character more but {0} pisses me off a bit.
2

"Best" is a very very open ended point.

Are you after :

  • Performance of the code
  • Speed the coder can write it
  • Ability for another coder to understand it easily
  • Ability for another coder to modify it easily

All of those make a big difference as to the "best" way of doing something.

Comments

2

I'd say it depends on what You need...

But to simplify it I would go with:

var s = new StringBuilder();
s.Append("one");
s.Append("two");
s.ToString();

But since we don't know what You need it for. It's pretty difficult to give better hints

1 Comment

I did exactly this before. StringBuilder supports fluent interface - see my question why I don't like this solution.
1

You should not define large strings in your source code. You should define it in an external text file:

string s = File.OpenText("myfile.txt").ReadToEnd();

Comments

1

Riffing off of what @codymanix said, you could place the long multiline string in a resource file. This can be easier for certain deployment scenarios since the text "file" will be included in your DLL / EXE.

1 Comment

+1 - I always do this for relatively big files but it's not very convenient when you need to write many small tests. It also decreases locality of code.
1

Ehm, how about:

string s = 
  "abc\n" + 
  "def\n" ;

1 Comment

You answer is very similar to Konrad Rudolph's. I'd prefer to use Environment.NewLine.
0

Sometimes you need more than one line. I use Environment.NewLine but I placed it in a method to multiply it. :)

    private string newLines(int multiplier)
    {
        StringBuilder newlines = new StringBuilder();
        for (int i = 0; i < multiplier; i++)
            newlines.Append(Environment.NewLine);
        return newlines.ToString();
    }

2 Comments

So how do you create string "one<newline>two"?
If you need just one line I'd use Konrad's solution because it seems to me the simplest one. However, if you needed more than one line I'd use StringBuilder and Append("one" + NewLines(3) + "two") for instance.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.