C# ~辞書~ Cランクレベルアップメニュー

現在働いている会社ではシステムエンジニア研修の１つに「paizaBランク問題をクリア」があるのでその目標を達成するまでの過程を備忘録として残します。

業務に参加した際に記述方法を忘れてしまっているであろう未来の自分に向けて、メモを残すと同時にこの記事がC#を学習している方、同じ箇所で躓いている方の参考になればと思っています。
ですので内容に誤りがある場合やより良い記述をご存知の方はコメントで共有していただけると嬉しいです。

それでは本編に入ります。
今回はPaizaラーニング、レベルアップ問題集「辞書」の問題をC#で回答したときの内容になります。

## STEP: 1 辞書の基本
問題文:https://paiza.jp/works/mondai/c_rank_level_up_problems/c_rank_dictionary_step1

```c#:paiza.cs
using System;
using System.Collections.Generic;
class Program
{
    static void Main()
    {
        int iDataNum = int.Parse(Console.ReadLine());
        var dNameMoney = new Dictionary<String, int>();
        for(var i = 0; i < iDataNum; i++){
            var aNameMoney = Console.ReadLine().Split(' ');
            dNameMoney.Add(aNameMoney[0], int.Parse(aNameMoney[1]));
        }
        
        Console.WriteLine(dNameMoney[Console.ReadLine()]);
    }
}
```

## STEP: 2 辞書のデータ更新
問題文:https://paiza.jp/works/mondai/c_rank_level_up_problems/c_rank_dictionary_step2

```c#:paiza.cs
using System;
using System.Collections.Generic;
class Program
{
    static void Main()
    {
        int iDataNum = int.Parse(Console.ReadLine());
        var dNameDamage = new Dictionary<String, int>();
        for(var i = 0; i < iDataNum; i++){
            string aNameDamage = Console.ReadLine();
            dNameDamage.Add(aNameDamage, 0);
        }
        int iDamageNum = int.Parse(Console.ReadLine());
        for(var j = 0; j < iDamageNum; j++){
            var aNameDamageUpdate = Console.ReadLine().Split(' ');
            // 現在のダメージ＋今追加されたダメージ
            int damegeUpdate = dNameDamage[aNameDamageUpdate[0]] + int.Parse(aNameDamageUpdate[1]);
            dNameDamage[aNameDamageUpdate[0]] = damegeUpdate;
        }
        Console.WriteLine(dNameDamage[Console.ReadLine()]);
    }
}
```

## STEP: 3 辞書データの順序
問題文:https://paiza.jp/works/mondai/c_rank_level_up_problems/c_rank_dictionary_step3
今回はdictionaryの並び替えがポイントでしたね。
dictionaryの並び替えは「SortedDictionary」と「OrderBy 」がありますがデータを追加したタイミングで並び替えてくれるベ便利なSortedDictionaryを使用しました。

```c#:paiza.cs
using System;
using System.Collections.Generic;
class Program
{
    static void Main()
    {
        int iDataNum = int.Parse(Console.ReadLine());
        var dNameDamage = new SortedDictionary<String, int>();
        for(var i = 0; i < iDataNum; i++){
            string aNameDamage = Console.ReadLine();
            dNameDamage.Add(aNameDamage, 0);
        }
        int iDamageNum = int.Parse(Console.ReadLine());
        for(var j = 0; j < iDamageNum; j++){
            var aNameDamageUpdate = Console.ReadLine().Split(' ');
            // 現在のダメージ＋今追加されたダメージ
            int damegeUpdate = dNameDamage[aNameDamageUpdate[0]] + int.Parse(aNameDamageUpdate[1]);
            dNameDamage[aNameDamageUpdate[0]] = damegeUpdate;
        }
        // 出力
        foreach ( var n in dNameDamage ){
            Console.WriteLine(n.Value );
        }
    }
}
```

## FINAL問題 辞書
問題文:https://paiza.jp/works/mondai/c_rank_level_up_problems/c_rank_dictionary_boss

```c#:paiza.cs
using System;
using System.Collections.Generic;
class Program
{
    static void Main()
    {
        var aPQR = Console.ReadLine().Split(' ');
        int P = int.Parse(aPQR[0]);
        int Q = int.Parse(aPQR[1]);
        int R = int.Parse(aPQR[2]);
        // key:依頼したAの番号 value: 依頼されたBの番号
        var A_B_request = new Dictionary<int, int>();
        for(var i = 0; i < P; i++)
        {
            var aIJ = Console.ReadLine().Split(' ');
            int i_P = int.Parse(aIJ[0]);
            int j_P = int.Parse(aIJ[1]);
            A_B_request.Add(i_P, j_P);
        }
        // key:依頼したBの番号 value: 依頼されたCの番号
        var B_C_request = new Dictionary<int, int>();
        for(var j = 0; j < Q; j++)
        {
            var aJK = Console.ReadLine().Split(' ');
            int j_Q = int.Parse(aJK[0]);
            int k_Q = int.Parse(aJK[1]);
            B_C_request.Add(j_Q, k_Q);
        }
        // key:依頼したAの番号 value: 依頼されたCの番号
        var A_C_request = new SortedDictionary<int, int>();
        foreach ( var n in A_B_request ){
            int B_num = n.Value; //Aから依頼を受けて、Cに依頼した人
            int C_num = B_C_request[B_num]; //B_numからいらいを受けた人
            A_C_request.Add(n.Key, C_num);
        }
        foreach(var answer in A_C_request){
            Console.Write(answer.Key + " ");
            Console.WriteLine(answer.Value);
        }
    }
}