2013-01-29 17 views
17

In test di unità, desidero codificare un blocco di righe come una stringa.qual è il modo migliore per eseguire l'hardcode di una stringa a più righe?

In C# farei

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

Dato che mi sono convertito a F # ho cercato di ridurre al minimo l'uso del metodo di .NET utilizzando bprintf invece, ma in qualche modo non c'è bprintfn supporto che sembra strano per me.

È tedioso aggiungere \r\n alla fine di ogni riga manualmente.

O c'è un modo migliore di StringBuilder?

risposta

6

Penso che non ci siano problemi con l'utilizzo di StringBuilder in F # come avete fatto.

c'è una funzione fprintfn in Printf module, in modo da poter usare con un oggetto StringWriter:

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

mi piace fprintf e fprintfn dal momento che sono flessibili. È possibile scrivere sull'output della console fornendo invece stdout.

2

Si potrebbe definire il proprio bprintfn funzione:

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

Oppure, per definire un multi-line letterale si potrebbe usare le triple virgolette come bytebuster suggerito o un "verbatim letterale", che inizia con @ (vedi Strings on MSDN).

+0

Penso che questo dà 'myline1myline2myline3' - senza le linee di fondo – MiMo

+0

Ops. Hai ragione. Fisso. – Daniel

6

È possibile creare direttamente multilinea stringhe in F #:

let multiLineStr = 
    "myline1 
myline2 
myline3" 

e C#:

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

Uno svantaggio di questo è che non è possibile indentare il contenuto di stringhe che sembra scadente. – colinfang

38

Se hai meno di F # 3.0, le stringhe triple-citato può essere la risposta:

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

Sono fuori contatto con F #, ma potresti essere in grado di adattare il mio approccio normale:

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

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

Caratteristica poco nota: è possibile infatti indentare il contenuto di stringhe - terminando ogni riga con una barra rovesciata. spazi iniziali sulla riga seguente sono spogliati:

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" 

Sarà comunque necessario includere \n o \n\r alla linea termina anche se (come fatto nell'esempio di cui sopra), se si desidera che questi incorporato nel stringa finale.

+2

Wow, NON lo sapevo!+1 –

+0

Buon consiglio @ Kit - anche questo è nuovo. –

+3

Non mi piace questo approccio perché suppongo che non utilizzerebbe la piattaforma "Environment.NewLine' – knocte

10

Mi sorprende che nessuno ha parlato di questo:

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

" fondamentalmente "uguale al metodo di @jellyfish, ma sembra estremamente utile con tale formattazione. – colinfang

+0

questo è IMO come le virgolette triple avrebbero dovuto funzionare. Se vuoi scrivere un bel codice con le virgolette triple come è ora, questo rovina il rientro. – Michelrandahl

Problemi correlati