【C#】あなたのC#レベルはどれくらい？(新人、教育担当向け)

# はじめに
1. C#を触って1年以内の方向けです。
1. 記事内のレベル評価は完全に私の個人的なものです。
1. 教育担当になった時に新人のレベルを測るシチュエーションで記事を書いています。

# 環境
1. Visual Studio 2022
1. .Net6
1. C#
1. コンソールアプリケーション

# 問題
Q. コンソールアプリに九九表を出力して下さい。
※出力はカンマ区切り、2桁0埋めとします。
出力例：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2519245/5e0b6ec4-8d1b-6cb9-6318-16839624ab6a.png)

# レベル1
レベル1はC#の累計学習時間が10時間程度の方を想定しています。
まだまだプログラミングを初めたばかりです。0から教えたほうが良さそう。

```C#:レベル1のソースコード
Console.WriteLine("01,02,03,04,05,06,07,08,09");
Console.WriteLine("02,04,06,08,10,12,14,16,18");
Console.WriteLine("03,06,09,12,15,18,21,24,27");
Console.WriteLine("04,08,12,16,20,24,28,32,36");
Console.WriteLine("05,10,15,20,25,30,35,40,45");
Console.WriteLine("06,12,18,24,30,36,42,48,54");
Console.WriteLine("07,14,21,28,35,42,49,56,63");
Console.WriteLine("08,16,24,32,40,48,56,64,72");
Console.WriteLine("09,18,27,36,45,54,63,72,81");
Console.ReadLine();
```

### レベル1のソースコードの良くない点
1. すべてベタ書きしているので修正が大変です。
1. もし九十九の段の表を作ってと言われたら泣きながらプログラミングする羽目になります。

# レベル2
レベル2はC#の累計学習時間が100時間程度の方を想定しています。
変数やIF文、For文は基本的に使えるのでオブジェクト指向の概念くらいから教えるのが良さそう。

```C#:レベル2のソースコード
for (var leftValue = 1; leftValue <= 9; leftValue++)
{

    var multiplicationTable = new List<string>();

    for (var rightValue = 1; rightValue <= 9; rightValue++)
    {
        var resultValue = leftValue * rightValue;

        if (resultValue.ToString().Length <= 1)
        {
            multiplicationTable.Add("0" + resultValue.ToString());
        }
        else
        {
            multiplicationTable.Add(resultValue.ToString());
        }
    }

    var outputString = "";

    for (var i = 0; i <= multiplicationTable.Count - 1; i++)
    {
        //末尾にはカンマを入れないようにする。
        if (i != multiplicationTable.Count - 1)
        {
            outputString = outputString + multiplicationTable[i] + ",";
        }
        else
        {
            outputString = outputString + multiplicationTable[i];
        }
    }
    Console.WriteLine(outputString);
}
```

### レベル1のソースコードに比べて良くなった所
1. すべてベタ書きが治ったので修正が簡単になった。
1. もし九十九の段の表を作ってと言われてもfor文の数字を9から変えるだけで修正できるので楽しい。

### レベル2のソースコードの良くない点
1. If文、For文が沢山あってソースコードを読むのに時間がかかる。
1. ソースコードが長いので「0埋め三桁にして」と修正依頼が来た時に修正箇所を探すのが大変。

# レベル3
レベル3はC#の累計学習時間が1000時間以上の方を想定しています。
C#に存在するクラスとインターフェースをある程度知っていて、Linqとラムダ式を使える。
何も教えなくても案件に参加してもらおうかなと思うくらい。

```C#:レベル3のソースコード
var multiplicationData = Enumerable.Range(1, 9);

foreach (var multipleLeftValue in multiplicationData)
{
    var multiplicationTable = string.Join(',', multiplicationData.Select(x => (multipleLeftValue * x).ToString("00")));

    Console.WriteLine(multiplicationTable);

}
Console.ReadLine();
```

### レベル1のソースコードに比べて良くなった所
1. If文、For文がほとんどなくなってソースコードを読むのに時間がかからない。
1. ソースコードが短いので「0埋め三桁にして」と修正依頼が来た時に修正箇所をすぐに見つけることができる。

### レベル3のソースコードの良くない点
1. なし。(私がこのレベルで止まっているのでもし何かあったらコメントで教えてください！)

### レベル0(コードはとにかく短いほうが凄いと思っている人)
レベル0はC#の累計学習時間が100～1000時間未満の方を想定しています。
C#である程度プログラミングができるようになってコードは短いほうが凄いと思いこんでいます。

```C#:レベル0のソースコード
Enumerable.Range(1, 9).Select(x => Enumerable.Range(1, 9).Select(y => (x * y).ToString("00"))).Select(z => string.Join(',', z)).ToList().ForEach(a => Console.WriteLine(a));
Console.ReadLine();
```
### レベル0のソースコードの良くない点
1. こんなコード誰も読みたくないです。可読性を考えてプログラミングしましょう。
1. 1箇所修正したらどんな挙動をするのか想像できません。
1. もし九十九の段の表を作ってと言われたら変数を使っていないので4箇所修正しないといけないソースコードになっています。

# レベル4以上の方々
コメントで教えてください🙇‍♀

# おわりに
もし私が新人の教育担当になったらこんな問題を第一に出すかなと考えながら記事を書きました。
すこしでも参考になれば嬉しいです！
以上です。