web-dev-qa-db-ja.com

文字列をFシャープで文字のリストに分割する方法

たとえば、「He​​llo」という単語を文字のリストに分割する場合など、Fシャープで文字列を文字のリストに分割するにはどうすればよいですか。

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

私はSplit([| |])を試しましたが、渡したパラメータに応じて文字列を分割するだけです。

私はこれを試しましたが、それでもうまくいきませんでした

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

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

Seq.toListを使用して、文字列を文字のリストに変換できます。

Seq.toList "Hello"
18
Chad Gilbert

文字列は、基本的には文字列です implementsIEnumerable<char>。内部的には、文字列はchar値の配列です。その配列は Chars インデクサーを通じて公開されます。

文字列に対して任意のSeqメソッドを使用できます。例:

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

個別のキャラクターも用意されています

String module の最適化された関数を使用することもできます。

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

Stringモジュールは、Stringクラスのメソッドを使用してパフォーマンスを向上させます。たとえば、 String.length 関数はString.Lengthプロパティのエイリアスであるため、Seqのようにすべての文字を反復処理する必要はありません。

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

String.iter などの他の関数は、Charsインデクサーを直接使用します。

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

.NETでは、 String.ToCharArray メソッドを使用できます。文字列に戻るには、コンストラクターを関数として使用するF-#を使用して String(Char []) を使用できます。

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

F#アレイモジュールを使用する方がパフォーマンスが向上する場合があります。 List.ofArrayList.ofSeqよりも効率的だと思います。それが問題ではない場合、Chadの回答と同様に、F#の慣用的な方法は次のとおりです。

"Hello" |> List.ofSeq
2
Cameron Taggart

最初に何かをchar配列またはリストに分割することを最初に考えたが、もっと簡潔にする必要がある場合があることに気づきました。

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"

「resultA」の方がいいと思います。

2
Tom Ell