ゆるふわで雑な日記

Microsoft系の技術情報を中心にゆるふわに綴っていく予定です

古典的な入門コードを新しめのC#で書き換えてみる

プログラム始めた頃に、↓こんなやつ出力した経験はありませんか?
1, 2, 3, 4, 5, 6, 7, 8, 9
2, 4, 6, 8,10,12,14,16,18
3, 6, 9,12,15,18,21,24,27
4, 8,12,16,20,24,28,32,36
5,10,15,20,25,30,35,40,45
6,12,18,24,30,36,42,48,54
7,14,21,28,35,42,49,56,63
8,16,24,32,40,48,56,64,72
9,18,27,36,45,54,63,72,81

私はありません(笑) とは言え基本的な要素が使用されてて、
教材には向いているような気がします。
まずは書いてみましょう。
最初の頃(1.0とか)のC#だとこんな感じでしょうか?
(結果は正しいことを確認しています)

using System;
class Program
{
    static void Main(string[] args)
    {
        for(int i = 1;i < 10; i++)
        {
            for(int j = 1; j < 10; j++)
            {
                Console.Write("{0,2}", i * j);
                if(j != 9)
                    Console.Write(",");
            }
                Console.WriteLine();
        }
    }
}

LINQを使うとこんな感じ(C#4.0以降)

using System;
using System.Linq;
class Program
{
    static void Main(string[] args)
    {
        //コードが横に長いのは1行なことをわかり易くするために改行していないため
        Console.WriteLine(string.Join("\r\n", Enumerable.Range(1, 9).Select(i => string.Join(",", Enumerable.Range(1, 9).Select(j => string.Format("{0,2}", i * j))))));
    }
}

C#6.0を使うとこんな感じ

using System.Linq;
using static System.Console;
using static System.Linq.Enumerable;

class Program
{
    static void Main(string[] args) => WriteLine(string.Join("\r\n", Range(1, 9).Select(i => string.Join(",", Range(1, 9).Select(j => $"{i * j, 2}")))));
}

それぞれの要素の説明は他にわかり易く解説しているサイトがたくさんあるので、割愛します。
また、各サンプルコードは実行効率を優先したものではなく、
『変化』の部分を強調するように書いてあります。
その為、やや非効率的に見える箇所が有ってもそのままにしてあります。
まあこんな風に書けるようになるよって言う紹介だと思っていただければ幸いです。