2013-01-29 4 views
17

Im Komponententest würde ich gerne einen Block von Zeilen als String fest codieren. statt, aber irgendwie gibt es keine bprintfn UnterstützungWas ist der beste Weg, um eine mehrzeilige Zeichenfolge fest zu codieren?

In C# würde ich

var sb = new StringBuilder(); 
sb.AppendLine("myline1"); 
sb.AppendLine("myline2"); 
sb.AppendLine("myline3"); 

tun Da ich zu F # umgewandelt ich durch die Verwendung bprintf die Verwendung von .NET-Methode zu minimieren versucht, die mir fremd zu sein scheint.

Es ist mühsam, am Ende jeder Zeile manuell \r\n hinzuzufügen.

Oder gibt es einen besseren Weg als StringBuilder?

Antwort

6

Ich denke, es ist kein Problem bei der Verwendung StringBuilder in F #, wie Sie getan haben.

Es gibt eine Funktion fprintfn in Printf module, so können Sie es mit einem StringWriter Objekt verwenden:

let sw = new StringWriter() 
fprintfn sw "myline1" 
fprintfn sw "myline2" 
fprintfn sw "myline3" 
sw.ToString() 

Ich mag fprintf und fprintfn, da sie flexibel sind. Sie können in die Konsolenausgabe schreiben, indem Sie stattdessen stdout angeben.

2

Sie könnten Ihre eigene bprintfn Funktion definieren:

let bprintfn bldr fmt = 
    (bldr, fmt) ||> Printf.kbprintf bldr.AppendLine 

Oder ein mehrzeiliges wörtlichen definieren Sie die dreifachen Anführungszeichen als bytebuster vorgeschlagen oder verwenden könnten „wörtlich wörtliche“, die mit @ beginnen (siehe Strings on MSDN).

+0

Ich denke, das 'myline1myline2myline3' gibt - ohne die Endlinie – MiMo

+0

Oops. Du hast recht. Fest. – Daniel

6

können Sie erstellen direkt mehrzeiligen Stringliterale in F #:

let multiLineStr = 
    "myline1 
myline2 
myline3" 

und C#:

var multiLineStr = 
    @"myline1 
myline2 
myline3"; 
+1

Ein Nachteil davon ist, dass Sie den String-Inhalt nicht einrücken können, der schlecht aussieht. – colinfang

38

Wenn Sie unter F # 3.0, Triple-Strings in Anführungszeichen kann die Antwort sein:

let x = """ 
myline1 
myline2 
myline3""" 
0

ich bin mit F # out of touch, aber man könnte meinen normalen Ansatz zu tun in der Lage anpassen:

['line1', 'line2', 'line3'].join('\n'); //javascript 

StringUtils.join(Arrays.asList("line1", "line2", "line3"), "\n")); // java, using Apache Commons Lang 
68

Wenig bekanntes Feature: Sie können tatsächlich Zeichenfolge Inhalt einrücken - indem Sie jede Zeile mit einem Backslash beenden. Führende Leerzeichen in der folgenden Zeile werden entfernt:

let poem = "The lesser world was daubed\n\ 
      By a colorist of modest skill\n\ 
      A master limned you in the finest inks\n\ 
      And with a fresh-cut quill.\n" 

Sie werden noch \n oder \n\r in Zeile enthalten müssen endet aber (wie im Beispiel oben geschehen), wenn Sie in Ihrem letzten String diese eingebettet werden sollen.

+2

Wow, wusste das nicht!+1 –

+0

Guter Tipp @ Kit - das ist auch neu für mich. –

+3

Ich mag diesen Ansatz nicht, weil ich denke, es würde nicht die plattformunabhängige 'Environment.NewLine' – knocte

10

Ich bin überrascht, niemand dies erwähnt hat:

[ "My first line" 
    "second line" 
    "another line" ] 
|> String.concat "\n" 
+0

verwenden, es ist im Grunde das gleiche wie @Jellyfishs Methode, aber sieht unter solchen Formatierungen extrem nützlich aus. – colinfang

+0

das ist IMO wie Triple Quotes hätte funktionieren sollen. Wenn Sie schönen Code mit dreifachen Anführungszeichen schreiben möchten, wie es jetzt ist, wird nur die Einrückung verschraubt. – Michelrandahl

Verwandte Themen