rksoftware

Visual Studio とか C# とかが好きです

C# で令和元年を表示する

先日、de:code 2019 に参加してきました。

その中で最後に聴講した「C# ドキドキ・ライブコーディング対決 @ de:code - ONLY C#!! Blazor Web 開発バトル -」というセッションがとても面白く、選択して大正解でした。

登壇者の皆様、素晴らしいセッションをありがとうございます。

■ 私も書いてみたい!

その中で出たお題として C# で令和を表示というものがあって、自分だったらどう書けるだろう? と思ったのでちょっと電車の中で書いてみました。Blazor はまだ着手していないので、コンソールアプリです。Console.ReadLine で読んだ西暦日付テキストを和暦にして Console.WriteLine しています。
電車の中なのであまりちゃんとは考えもデバッグもしてません。バグありそう。

■ 私なりの令和元年

using System;
using System.Linq;

namespace SeirekiToWareki
{
    class Program
    {
        static void Main(string[] args)
        {
            // 入力を読み取り
            var input = Console.ReadLine();

            // 和暦に変換
            var wareki = new (DateTime start, string gengo)[] { (new DateTime(2019, 05, 01), "令和"), (new DateTime(1989, 01, 08), "平成"), (new DateTime(1926, 12, 25), "昭和"), (new DateTime(1912, 07, 30), "大正"), (new DateTime(1868, 10, 23), "明治"), }.OrderBy(g => g.start).Select(g => new { Seireki = DateTime.TryParse(input, out var seireki) ? (DateTime?)seireki : null, Gengo = g }).Where(g => g.Seireki != null).TakeWhile(g => g.Seireki >= g.Gengo.start).Select(g => new { year = g.Seireki.Value.Year - g.Gengo.start.Year + 1, Seireki = g.Seireki.Value, Gengo = g.Gengo.gengo }).Select(g => $"{g.Gengo}{(g.year == 1 ? "" : g.year.ToString())}年{g.Seireki.Month}月{g.Seireki.Day}日").LastOrDefault() ?? "和暦に変換できませんでした.";

            // 和暦を表示
            Console.WriteLine(wareki);
        }
    }
}

■ 実行してみる

2019/05/01
令和元年5月1日

なんだかそれらしい結果になりました。