文字列の反転
簡単に書けると楽しい。
[<Test>]
let ``reverse string`` () =
let x = "abcdef"
Assert.AreEqual("fedcba", x |> Array.ofSeq |> Array.rev |> String.Concat)
追記
サロゲートペアのことを考えないといけない。なるほど。
- http://stackoverflow.com/questions/4556160/is-there-more-simple-or-beautiful-way-to-reverse-a-string
こうなりました。
[<Test>]
let ``reverse string`` () =
let myString = "\uD800\uDC00\u0061\u0300\u00C6"
Assert.AreEqual("𐀀àÆ" , myString)let sequence = seq {
let tee = StringInfo.GetTextElementEnumerator(myString)
while tee.MoveNext() do
yield tee.GetTextElement()
}
Assert.AreEqual("Æà𐀀" , sequence |> Array.ofSeq |> Array.rev |> String.Concat)
追記
オブジェクト式を使ったほうがかっこいいかも。
[<Test>]
let ``reverse string`` () =
let myString = "\uD800\uDC00\u0061\u0300\u00C6"
Assert.AreEqual("𐀀àÆ" , myString)
let sequence = { new IEnumerable with
member x.GetEnumerator() =
StringInfo.GetTextElementEnumerator(myString) :> IEnumerator }
Assert.AreEqual("Æà𐀀" , sequence |> Seq.cast<string> |> Array.ofSeq |> Array.rev |> String.Concat)