文字列
文字列 Strings
元ネタ http://msdn.microsoft.com/ja-jp/library/dd323829.aspx
エスケープシーケンスの扱いは C# と同じ。
@ 記号の後に続くリテラルは、逐語的文字列です。 この場合、2 つの引用符文字が 1 つの引用符文字として解釈されることを除いて、エスケープ シーケンスはすべて無視されます。
また、文字列は三重の引用符で囲まれている場合があります。
F#
let data = """ ここで複数行のデータを書ける。 XMLデータとかを文字列で書けるので良いらしい。 """
@ 記号を使った書き方
F#
// Using a verbatim string let xmlFragment1 = @"<book author=""Milton, John"" title=""Paradise Lost"">" // Using a triple-quoted string let xmlFragment2 = """<book author="Milton, John" title="Paradise Lost">"""
C# も @ 記号で文字列をエスケープできる。 C#
string xmlFragment1 = @"<book author=""Milton, John"" title=""Paradise Lost"">";
1文字だけ出力する。
F#
printfn "%c" str1.[1]
C# の場合は、string.Format を使う。
C#
Console.WriteLine("{0}", str1[1] );
部分文字列を表示する
F#
printfn "%s" (str1.[0..2]) printfn "%s" (str2.[3..5])
F# の意味としては、それぞれの要素を指定しているので範囲とは異なるのだが、C# の場合は文字列に対しては直に Substring を使う。
C#
Console.WriteLine("{0}", str1.Substring(0,3)); Console.WriteLine("{0}", str2.Substring(3,3));
リテラル文字列が ASCII 文字列であることを示すには、サフィックス B を追加します。
F#
// "abc" interpreted as a Unicode string. let str1 : string = "abc" // "abc" interpreted as an ASCII byte array. let bytearray : byte[] = "abc"B
Unicode(Char)ではなくて、ASCII(byte)という違いがある。
C# の場合は、文字列は Char で扱うので byte 配列に変換する拡張メソッドを用意する。
C#
public void test() { string str1 = "abc"; byte[] bytearray = "abc".B(); } public static class StringExtentions { public static byte[] ToByteArray( this string str ) { var src = str.ToArray<char>(); var dest = new byte[str.Length]; for ( int i=0; i<dest.Length; i++ ) { dest[i] = (byte)src[i]; } return dest; } public static byte[] B(this string str) { return str.ToByteArray(); } }
文字列演算
文字列を連結するには、+ 演算子または ^ 演算子を使用する 2 つの方法があります。
F#
let string1 = "Hello, " + "world"
これは C# も同じ。
C#
var string1 = "Hello, " + "world";
String クラス
String の Chars プロパティを使用すると、次のコードに示すように、インデックスを指定して文字列中の各文字にアクセスできます。
F#
let printChar (str : string) (index : int) = printfn "First character: %c" (str.Chars(index))
Chars プロパティはないが、そのまま Char 配列として扱える。
C#
void printChar(string str, int index) { Console.WriteLine("First character: %c", str[index]); }