web-dev-qa-db-fra.com

Comment diviser une chaîne en une liste de caractères en fa dièse

Comment diviser une chaîne en une liste de caractères dans F Sharp, par exemple, si je souhaite diviser le mot "Hello" en une liste de caractères, par exemple.

"Hello" ->['H';'e';'l';'l';'o']

J'ai essayé Split ([| |]) mais il ne divise qu'une chaîne en fonction du paramètre u passé.

J'ai essayé cela mais cela n'a toujours pas fonctionné

let splitChar (text:string) = 
    [for c in text ->c] 

let splitChar (text:string) = 
    [for c in text do yield c] 
8
Gsp Ivan

Vous pouvez utiliser Seq.toList pour convertir une chaîne en une liste de caractères:

Seq.toList "Hello"
14
Chad Gilbert

Une chaîne de caractères est essentiellement une séquence de caractères, car elle implémenteIEnumerable<char>. En interne, une chaîne est un tableau de valeurs char. Ce tableau est exposé par le biais de Chars indexer.

Vous pouvez utiliser n'importe quelle méthode Seq sur une chaîne, par exemple:

"abc" |> Seq.iter (fun x->printfn "%c" x)

Les personnages individuels sont également disponibles 

Vous pouvez également utiliser les fonctions optimisées du module String :

"abc" |> String.iter (fun x->printfn "%c" x)

Le module String utilise les méthodes de la classe String pour améliorer les performances. Par exemple, la fonction String.length est un alias pour la propriété String.Length. Il n'est donc pas nécessaire de parcourir tous les caractères comme Seq ferait:

    let length (str:string) =
        let str = emptyIfNull str
        str.Length

D'autres fonctions, comme String.iter utilisent directement l'indexeur Chars:

    let iter (f : (char -> unit)) (str:string) =
        let str = emptyIfNull str
        for i = 0 to str.Length - 1 do
            f str.[i] 
5
Panagiotis Kanavos

En .NET, vous pouvez utiliser String.ToCharArray method. Pour revenir dans une chaîne, vous pouvez utiliser String (Char []) maintenant que F # utilise des constructeurs comme fonctions.

"Hello".ToCharArray() |> List.ofArray

Il peut être préférable d’utiliser simplement le module F # Array. Je suppose que List.ofArray est plus efficace que List.ofSeq. Si cela n'a pas d'importance, comme dans la réponse de Chad, la méthode idiomatique en F # est la suivante:

"Hello" |> List.ofSeq
0
Cameron Taggart

J'ai remarqué des occasions où je pensais initialement diviser quelque chose en un tableau de caractères ou une liste - mais où je devrais être plus concis. 

let msg = "hello-world"

let resultA = 
    msg.[0..0].ToUpper() + msg.[1..].Replace('-', ' ')

let resultB = 
    Seq.toList (msg)
    |> (fun list -> (string list.Head).ToUpper() + (String.Concat(list.Tail)).Replace('-', ' '))

// val resultA : string = "Hello world"
// val resultB : string = "Hello world"

Le résultat est meilleur, je pense.

0
Tom Ell