2009-11-22 9 views
15

Estoy intentando esto en este momento, pero todavía no he logrado que la firma del método haya funcionado ... ¿Alguien más? mensajes es un campo de la SEC [cadena]¿Cómo concateno una lista de cadenas en F #?

let messageString = List.reduce(messages, fun (m1, m2) -> m1 + m2 + Environment.NewLine) 

Respuesta

31

No es exactamente lo que estás buscando, pero

let strings = [| "one"; "two"; "three" |] 
let r = System.String.Concat(strings) 
printfn "%s" r 

Usted puede hacer

let strings = [ "one"; "two"; "three" ] 
let r = strings |> List.fold (+) "" 
printfn "%s" r 

o

let strings = [ "one"; "two"; "three" ] 
let r = strings |> List.fold (fun r s -> r + s + "\n") "" 
printfn "%s" r 
+0

Fui por la opción de doblar. No es el más conciso, pero estoy intentando cosas diferentes para entender el idioma ... gracias – mwjackson

+1

o simplemente 'Seq.fold (+)" "' para la tercera manera. beneficio sobre 'reducir' es que no obtendrá una excepción "La secuencia de entrada estaba vacía" si está vacía –

2
System.String.Join(Environment.NewLine, List.to_array messages) 

o utilizar el pliegue (tenga en cuenta que es mucho más ineficiente)

List.reduce (fun a b -> a^Environment.NewLine^b) messages 
+2

Estoy seguro de que un StringBuilder sería más rápido que un algoritmo de concatenación. – codebliss

+0

Sí, es por eso que llamé ineficaz a la segunda solución, confiando en String.Join/concat usando un StringBuilder internamente. – Dario

+0

@Dario, ¿cuál es el propósito de usar^y Env.NewLine en lugar de + y "\ n"? – Stringer

31
> String.concat " " ["Juliet"; "is"; "awesome!"];; 
val it : string = "Juliet is awesome!" 
+0

Este es el camino a seguir, observe que String aquí se refiere a la biblioteca F # Core.String que se importa de manera predeterminada: https://msdn.microsoft.com/en-us/library/ee353761.aspx – chillitom

+2

["Juliet"; "es"; "¡increíble!"] |> String.concat "" ;; –

3

que haría uso de String.concat a menos que tiene que hacer el formato más elegante y que haría uso de StringBuilder.

(StringBuilder(), [ "one"; "two"; "three" ]) 
||> Seq.fold (fun sb str -> sb.AppendFormat("{0}\n", str)) 
1

simplemente un comentario más,

cuando usted está haciendo con una cuerda, es mejor utilizar las funciones de cadena estándar.

El código siguiente es un problema para EulerProject 40.

let problem40 = 
    let str = {1..1000000} |> Seq.map string |> String.concat "" 
    let l = [str.[0];str.[9];str.[99];str.[999];str.[9999];str.[99999];str.[999999];] 
    l |> List.map (fun x-> (int x) - (int '0')) |> List.fold (*) 1 

si la segunda línea del programa anterior utiliza en lugar de doblar concat, sería extremadamente lento debido a que cada iteración del pliegue crea una nueva cadena larga.

Cuestiones relacionadas