やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

C#チュートリアル(文字列補完の高度なシナリオ)

 エスケープシーケンスとか。

成果物

情報源

 サイト左メニューから選択した。ここから先は左メニューから順次やっていく。チュートリアルページにはもうリンクがなかったので。

 前回と被っている箇所は飛ばす。

エスケープシーケンスを使う

{,}エスケープする

var xs = new int[] { 1, 2, 7, 9 };
var ys = new int[] { 7, 9, 12 };
Console.WriteLine($"Find the intersection of the {{{string.Join(", ",xs)}}} and {{{string.Join(", ",ys)}}} sets.");
Find the intersection of the {1, 2, 7, 9} and {7, 9, 12} sets.

 $""構文の中で{{,}}のように2回連続で書けば{,}を1字出力する。内部の{}は文字列補完として解釈される。

バックスラッシュ\を出力する

var stringWithEscapes = $"C:\\Users\\{userName}\\Documents";
var verbatimInterpolated = $@"C:\Users\{userName}\Documents";
C:\Users\Jane\Documents
C:\Users\Jane\Documents

三項演算子を使う

var rand = new Random();
for (int i = 0; i < 7; i++)
{
    Console.WriteLine($"Coin flip: {(rand.NextDouble() < 0.5 ? "heads" : "tails")}");
}
Coin flip: heads
Coin flip: heads
Coin flip: heads
Coin flip: tails
Coin flip: tails
Coin flip: heads
Coin flip: tails

 何もインポートせずにランダムが使えるっていいね。Rustとは違うのだよ。

カルチャ固有の結果を得る

var cultures = new System.Globalization.CultureInfo[]
{
    System.Globalization.CultureInfo.GetCultureInfo("en-US"),
    System.Globalization.CultureInfo.GetCultureInfo("en-GB"),
    System.Globalization.CultureInfo.GetCultureInfo("nl-NL"),
    System.Globalization.CultureInfo.GetCultureInfo("ja-JP"),
    System.Globalization.CultureInfo.InvariantCulture
};

var date = DateTime.Now;
var number = 31_415_926.536;
FormattableString message = $"{date,20}{number,20:N3}";
foreach (var culture in cultures)
{
    var cultureSpecificMessage = message.ToString(culture);
    Console.WriteLine($"{culture.Name,-10}{cultureSpecificMessage}");
}
en-US     10/24/2019 12:21:59 PM      31,415,926.536
en-GB      24/10/2019 12:21:59      31,415,926.536
nl-NL      24-10-2019 12:21:59      31.415.926,536
ja-JP      2019/10/24 12:21:59      31,415,926.536
           10/24/2019 12:21:59      31,415,926.536

インバリアントカルチャを使う

string messageInInvariantCulture = FormattableString.Invariant($"Date and time in invariant culture: {DateTime.Now}");
Console.WriteLine(messageInInvariantCulture);
Date and time in invariant culture: 10/24/2019 12:19:49

所感

 エスケープシーケンスについては覚えておきたい。

対象環境

$ uname -a
Linux raspberrypi 4.19.42-v7+ #1218 SMP Tue May 14 00:48:17 BST 2019 armv7l GNU/Linux