views:

337

answers:

8

Hi!

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?

+10  A: 

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.)

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

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();
    }
G Berdal
So how do you create string "one<newline>two"?
Konstantin Spirin
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.
G Berdal
+1  A: 

"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.

Robin Day
I care only about readability.
Konstantin Spirin
For readability alone I would go with orsogufo's answer.
Robin Day
+14  A: 

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" 
    );
}
Paolo Tedesco
+1 I find this one the easiest to "read".
Robin Day
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")
Konstantin Spirin
I had thought about the extension method, but in the end I think I prefer the "plain" old-style utility...
Paolo Tedesco
A: 

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

Woodbase
AppendLine hopefully..
Ian
Yes of course. Otherwise it wouldn't be a multi line.
Woodbase
I did exactly this before. StringBuilder supports fluent interface - see my question why I don't like this solution.
Konstantin Spirin
A: 

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();
codymanix
+1  A: 

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.

Doug McClean
+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.
Konstantin Spirin
A: 

Ehm, how about:

string s = 
  "abc\n" + 
  "def\n" ;
ZJR
You answer is very similar to Konrad Rudolph's. I'd prefer to use Environment.NewLine.
Konstantin Spirin