2009-11-22 24 views
15

Próbuję tego w tej chwili, ale nie całkiem mam podpis metody wypracowany ... ktoś? wiadomości jest dziedziną seq [ciąg]Jak połączyć listę ciągów w F #?

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

Odpowiedz

31

Nie dokładnie to, czego szukasz, ale

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

Można zrobić

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

lub

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

Poszedłem po opcję składania. Nie najbardziej zwięzły, ale próbuję różnych rzeczy, aby opanować język ... dzięki – mwjackson

+1

lub po prostu 'Seq.fold (+)" "' dla trzeciej drogi. korzyścią z 'zmniejszenia' jest to, że nie otrzymasz wyjątku" Sekwencja wejściowa była pusta "jeśli jest pusta –

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

lub używając krotnie (należy pamiętać, że jest to o wiele bardziej nieefektywne)

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

Jestem pewien, że StringBuilder byłby szybszy niż algorytm konkatenacji. – codebliss

+0

Tak, dlatego nazwałem drugie rozwiązanie nieefektywne - polegając na String.Join/concat używając wewnętrznie StringBuilder. – Dario

+0

@Dario, jaki jest cel używania^i Env.NewLine zamiast + i "\ n"? – Stringer

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

To jest sposób, aby przejść, Uwaga Ciąg tutaj odnosi się do biblioteki F # Core.String, która jest importowana domyślnie: https://msdn.microsoft.com/en-us/library/ee353761.aspx – chillitom

+2

["Julia"; "jest"; "awesome!"] |> String.concat "" ;;; –

3

użyję String.concat chyba trzeba zrobić hodowcy formatowania, a następnie użyję StringBuilder.

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

tylko jeden komentarz,

kiedy robisz sznurkiem, lepiej użyć standardowych funkcji ciągów.

Poniższy kod jest EulerProject problemu 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 

jeśli druga linia powyższego programu korzysta krotnie zamiast concat, byłoby bardzo powolne, ponieważ każda iteracja krotnie tworzy nowy długi ciąg.

Powiązane problemy