restofwaterimpのぎじゅつMemo

SIerに所属してます。企画から運用までやってます。現状、プロジェクトをスクラムで回したい!と試行錯誤中です

【C#】C#プログラミングのイディオム(7章)ディクショナリの操作

前回の話

restofwaterimp.hatenablog.com

基礎編もあと2章。次はディクショナリ。 業務アプリでは、データベースより取得した値や、内部でkey-valueで処理した方が良い時に利用しています。

ただ、あまり詳細なことを知らずに使っていた部分もあったので、書籍を読みながら振り返ります。

本章の内容 * Dictionaryの基本操作 * ディクショナリの応用 * サンプル(Abbreviationsクラス)

docs.microsoft.com

この章の前半はMicrosoftのリファレンスなどを参考するとわかりやすい。

            /* pre C# 5.0 */
            var flowerDict = new Dictionary<string, int>(){
                {"sunflower", 400},
                {"pansy", 300},
                {"tulip", 250},
                {"rose", 500},
                {"dahlia", 450},
            };

            /* after C# 6.0 */
            var flowerDict2 = new Dictionary<string, int>(){
                ["sunflower"] =  400,
                ["pansy"]= 300,
                ["tulip"]= 250,
                ["rose"]= 500,
                ["dahlia"]= 450,
            };

            // Add Dictionary Plus
            flowerDict.Add("himawari", 400);

            /*KeyとValueで分けないと、Dictionaryの値がそのまま出力される*/
            foreach (var s in flowerDict)
            {
                Console.WriteLine(s);
            }
            /*Keyとvalueに分ければ、それぞれの値を利用可能*/
            foreach (KeyValuePair<string, int> item in flowerDict)
            {
                Console.WriteLine("{0} = {1}", item.Key, item.Value);
            }

            flowerDict2["piti"] = 600;

            /*指定したキーの値がないものをそのまま利用すると、KeyNotFoundExceptionが発生*/
            Console.WriteLine(flowerDict["xx"]);

            /*回避するには、ContainsKeyを利用し存在チェックをするか、TryでExceptionを捕まえる*/
            /*指定したキーに該当する値があるか*/
            Console.WriteLine(flowerDict.ContainsKey("xx"));

通常のaddやremoveも利用しますが、Exceptionを発生させない方法を覚えておく。

タイプ keyの重複 格納する値
List 可能 なんでもOK
HashSet 不可 key
Dictionary 不可 key,value

Dictioonaryもkeyの重複はNGだが、valueのところをListやカスタムクラスを利用し、 keyに対するvalueを複数持たせることも可能で、 value に List型を指定すれば良い。

Listなら dict["xxx"].Add(value); と値を設定可能。

DictionaryのvalueにDictionaryを使う、多重構造もかけると思いますが、 記述すると複雑に・・・。 それよか、valueにクラスなどカスタマイズしたものを配置してコントロールした方が よさげです。

この章はざっと書いてありましたが、コーディングして身につけるのが一番の近道かと思います。

次は8章の時刻か・・・

つづく