Comment concaténer une liste de chaînes de caractères en F#?
Je vais essayer cela pour le moment, mais je n'ai pas encore reçu la signature de la méthode a fonctionné... quelqu'un? messages est un champ de seq[string]
let messageString = List.reduce(messages,fun(m1, m2)-> m1 + m2 + Environment.NewLine)
let strings =[|"one";"two";"three"|]let r = System.String.Concat(strings)
printfn "%s" r
Vous pouvez faire
let strings =["one";"two";"three"]let r = strings |> List.fold (+)""
printfn "%s" r
ou
let strings =["one";"two";"three"]let r = strings |> List.fold (fun r s -> r + s +"\n")""
printfn "%s" r
Je suis allé pour l'option de fold. Pas la plus concise, mais je vais essayer des choses différentes pour obtenir le coup de la langue... merci ou tout simplement Seq.fold (+) "" pour la troisième voie. le bénéfice reduce est que vous n'obtiendrez pas une "séquence d'entrée était vide" exception si elle est vide
> String.concat " "["Juliet";"is";"awesome!"];;val it : string ="Juliet is awesome!"
C'est la manière de faire, note la Chaîne se réfère ici à la Base F#.De la bibliothèque String qui est importé par défaut: msdn.microsoft.com/en-us/library/ee353761.aspx ["Juliette"; ""; "génial!"] |> String.concat " ";;
J'avais utiliser des chaînes de caractères.concat sauf si vous avez besoin de faire plus extravagant de mise en forme et puis je utiliser StringBuilder.
ou à l'aide de votre pli (notez qu'il est beaucoup plus inefficace)
List.reduce (fun a b -> a ^ Environment.NewLine ^ b) messages
Je suis sûr qu'un StringBuilder serait plus rapide qu'un enchainement de l'algorithme. Oui, c'est pourquoi j'ai appelé la 2ème solution inefficace - en s'appuyant sur la Chaîne.Join/concat à l'aide d'un StringBuilder en interne. quel est le but de l'aide ^ et Env.De retour à la ligne, au lieu de + "\n" ? N'est-ce pas ^ l'opérateur de concaténation de chaîne? J'ai utilisé Env.De retour à la ligne, car il était utilisé dans la question. Je ne sais pas OCaml, mais je considère cela comme une mauvaise pratique à utiliser (+) pour les non-arithmétique but.
quand vous le faites avec de la ficelle, vous feriez mieux d'utiliser les fonctions de chaîne.
Le code suivant EulerProject problème 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 deuxième ligne de programme ci-dessus utilise à la fois au lieu de concat, il serait extrêmement lent parce que chaque itération de fois crée une nouvelle chaîne longue.
Pas exactement ce que vous cherchez, mais
Vous pouvez faire
ou
ou tout simplement
Seq.fold (+) ""
pour la troisième voie. le bénéficereduce
est que vous n'obtiendrez pas une "séquence d'entrée était vide" exception si elle est videOriginalL'auteur Brian
["Juliette"; ""; "génial!"] |> String.concat " ";;
OriginalL'auteur Juliet
J'avais utiliser des chaînes de caractères.concat sauf si vous avez besoin de faire plus extravagant de mise en forme et puis je utiliser StringBuilder.
OriginalL'auteur gradbot
ou à l'aide de votre pli (notez qu'il est beaucoup plus inefficace)
Oui, c'est pourquoi j'ai appelé la 2ème solution inefficace - en s'appuyant sur la Chaîne.Join/concat à l'aide d'un StringBuilder en interne.
quel est le but de l'aide ^ et Env.De retour à la ligne, au lieu de + "\n" ?
N'est-ce pas ^ l'opérateur de concaténation de chaîne? J'ai utilisé Env.De retour à la ligne, car il était utilisé dans la question.
Je ne sais pas OCaml, mais je considère cela comme une mauvaise pratique à utiliser (+) pour les non-arithmétique but.
OriginalL'auteur Dario
juste un commentaire,
quand vous le faites avec de la ficelle, vous feriez mieux d'utiliser les fonctions de chaîne.
Le code suivant EulerProject problème 40.
si la deuxième ligne de programme ci-dessus utilise à la fois au lieu de concat, il serait extrêmement lent parce que chaque itération de fois crée une nouvelle chaîne longue.
OriginalL'auteur Yin Zhu