‫そして､ 前回の動画では､ ハッシュテーブルについてお話しました｡
‫そこで､ このレッスンでは､ ハッシュテーブルの汎用版がどのようなものか､ ハッシュテーブルの汎用版がディクショナリであることについて説明します｡
‫そこで､ このビデオでは､ 辞書の使い方を紹介します｡
‫ハッシュ・テーブルと同様に､ 辞書にはその値とキー・バリューのペアが格納されます｡
‫先ほど､ autoのキー・バリュー・ペアはcarと言いました｡
‫そこでキーとなるのが､ ドイツ語で車を意味する「auto」でしょう｡
‫そして､ carはこの辞書の中に入っている値になります｡
‫それは､ 例えばドイツ語の英語辞書の中にある現実の辞書なんですね｡
‫しかし､ これからはプログラミング辞書を使うことになる｡
‫C-Sharpの辞書は､ ここにあるようなキーと値のペアを持ち､ 特定のキーに割り当てられた値を保存するわけです｡
‫だから
‫では､ 辞書の定義をしてみましょう｡
‫そこで､ Microsoftのドキュメントを見ると､ 辞書はこのように定義されています｡
‫つまり､ この辞書のrt値のようなものになるわけです｡
‫つまり､ キーと値の型は､ リストと同じように宣言で指定する必要があるということです｡
‫だから､ リストも特定の型を持つ必要があった｡
‫リストは､ integer型､ string型､ object型など､ 様々な型があります｡
‫しかし､ このリストがどのようなものでなければならないかを定義する必要がありました｡
‫辞書も同様だが､ こちらはキーだけでなく値も定義しなければならない｡
‫つまり､ このキーとRT値の意味は､ 基本的にそういうことです｡
‫つまり､ 柔軟性は高いが､ ハッシュテーブルの時のような柔軟性はないということだ｡
‫つまり､ 基本的にはこのような辞書を作成し､ キーは整数型､ 値は文字列型とすることができます｡
‫そしてもちろん､ 辞書を使うためには､ コレクションが汎用的であるようなシステムを利用する必要があります｡
‫つまり､ 辞書は一般的なコレクションであることがわかります｡
‫ジェネリックコレクションとノンジェネリックコレクションの違いについては､ 別の動画で確認しました｡
‫つまり､ ハッシュテーブルや非汎用コレクション､ ディクショナリーは汎用コレクションなので､ メリットもデメリットもすべて備えているわけです｡
‫つまり､ この辞書には､ 整数､ いわば数字と､ 文字列となる値があることになります｡
‫つまり､ 数字がキー､ 文字列が値となる｡
‫ここでは､ my dictionaryという辞書を作成し､ すぐに空の辞書で初期化しています｡
‫この時点で､ 次にこのディクショナリーを使用することができますので､ そのディクショナリーに値を追加することができます｡
‫例えば､ すでにその辞書の値をそのまま定義することもできる｡
‫だから同じラインで､ 基本的にはここに｡
‫だから､ 例えば､ 辞書はこんな感じにしますよ､ と言えばいいんです｡
‫ここで､ 整数と文字列があります｡
‫つまり､ ここにある整数がキーで､ それに対するテキストが値となります｡
‫つまり､ 整数の型と､ この整数が何であるかを表す話し言葉があるわけです｡
‫つまり､ 1なら1､ 2なら2､ 3なら3というように｡
‫さて､ もちろん､ 辞書は整数や文字列に限ったものではない｡
‫私たちが保存しているもっと複雑な値を使うことができます｡
‫そこで例えば､ こちらのクラスを考えてみましょう｡
‫そこで､ employeeというクラスを新規に作成します｡
‫同じファイルに入れるが､ もちろん別のファイルを作ってもいい｡
‫そこで､ 社員一人一人について､ 行､ 名前､ 年齢､ 賃金といったいくつかのプロパティを用意しました｡
‫そして､ 給料ですが､ これはfloatで､ 8倍､ 5倍､ 4倍､ 12倍の割合で返ってきます｡
‫つまり､ レートが何倍であろうと､ この値が給与として保存または取得されることになります｡
‫そのため､ 仮に給与を取得する場合､ 直接給与を計算してくれます｡
‫つまり､ 8時間×5日×4週×12ヶ月ということですね｡
‫基本的にはそれで年俸を計算することになるわけです､ いわば｡
‫もちろん､ 倍率も｡
‫では次に､ 従業員のデータベースがあるとします｡
‫そうしよう｡
‫これが従業員のデータベースになるのでしょうね｡
‫ところで､ 今気づいたのですが､ コンストラクタを作るときに､ ここのレートを見落としていました｡
‫このコンストラクタでは､ レートも使用し､ ここにレートを代入して､ データベースからのデータを使用できるようにしています｡
‫そこで､ タイトル､ 名前､ 年齢､ スーパーおばあさん､ 95歳というデータベースを作成しました｡
‫そして､ 彼女のレートです｡
‫だから､ 彼女は200のレートを持っている｡
‫それから､ マネージャーのジョーは35歳で､ レートは25などです｡
‫では､ これからどうするかというと､ この辞書を使うのはやめよう｡
‫従業員ディレクトリと呼ぶ別の辞書を作成するつもりです｡
‫そして､ その社員名簿は基本的に文字列employeeのキー・バリュー・ペアを持つことになります｡
‫そのため､ 特定の文字列に対して､ 従業員オブジェクト全体を保存することになります｡
‫そして､ これをemployeesディレクトリと呼び､ 使用する文字列をemployeesロールにすることにします｡
‫なるほど｡
‫ここでは､ このfor eachループを使って､ employeesデータベースのすべての従業員を調べます｡
‫これが私の社員データベースです｡
‫いわば､ フリをしているのです｡
‫そうだろ？
‫その従業員の状態のデータベースのすべての単一の項目を通過し､
‫それは私の従業員ディレクトリに位置または役割のキーで､ 従業員自体を追加するつもりです｡
‫ここでは､ すべての役割に対して社員が1人しかいないと仮定していますが､ そうでなければ､ システム全体がおかしくなってしまいます｡
‫これは､ 偽のデータベースからのデータで辞書を作成する方法の例で､ 基本的には､
‫ここで定義した従業員の配列になります｡
‫では次に､ 辞書からデータを取得する場合はどうでしょうか｡
‫そこで､ 辞書からデータを取り出したいのですが､ 例えば､ CEOである社員のデータを取り出したいとします｡
‫それがCEOのポジションを持っているわけです｡
‫CEOが欲しいので､ その人物と､ CEOという肩書きを持つ人物のオブジェクト全体を知りたいのです｡
‫基本的には､ キーが私の辞書の従業員のためにCEOになる場所､ そこのディレクトリに固執すると言うだけです｡
‫誰がCEOなのか知りたいので､ 社員全員をオブジェクトに格納したい｡
‫そこで､ 次のようにコンソールの右行ステートメントを使って､ その従業員の詳細を表示させることができるようになりました｡
‫ここでは､ 従業員の名前､ つまり簡単な名前､ そして役割と給与を指定します｡
‫だからこれが表示されるのです｡
‫なるほど｡
‫ですから､ 基本的にはレートとここの計算を元に給料を出します｡
‫これは､ ロールを直接取得し､ 従業員オブジェクト自体から直接名前を取得します｡
‫だから､ このAppleのオブジェクトから
‫では､ 実際にクイーンの年収を見てみましょう｡ フルタイムで働くと考えると､
‫384,000円の給与であることがわかります｡
‫彼女の名前はグウェン､ 役割はCEOです｡
‫だから､ このコードを実行するとうまくいく｡
‫ご覧の通り､ ここに問題はありません｡
‫しかし､ 問題は､ 間違った値を入力していることかもしれません｡
‫例えば､ CEOの代わりにCTO､ つまり技術責任者を検索するとします｡
‫つまり､ CTOは辞書に存在しなかったので､ キーは与えられなかったと書かれています｡
‫そこで､ それを解決するために､ 基本的にはキーが存在するかどうかをチェックすればよいのです｡
‫そこで､ ここでは非常に良い確認方法となるものを紹介します｡
‫これは､ SEOというキー､ またはSEOという値を持つキーという文字列を作成することになる｡
‫そして､ 社員名簿を確認する｡
‫その特定のキーに対して
‫このように､ キーが含まれているのは､ お気に入りのオプションの1つです｡
‫だから､ キーを含む｡
‫そして､ ここではチェックしたい文字列をキーとして渡します｡
‫では､ CEOというキーは入っているのでしょうか？
‫もしそうなら､ ここでこのコードを実行してください｡
‫そして､ そうでない場合は､ 実行しないことです｡
‫もちろん､ このキーは存在しない､ と言い切ることもできます｡
‫つまり､ キーを入力するとアプリケーションがチェックするような小さなアプリケーションを作ることができるようになったのです｡
‫さて､ これは存在するのかしないのか？
‫ちなみに､ ここではこれをkeyに置き換えてください｡
‫もう､ ハードコードされることはないんです｡
‫まあ､ いわば別のところでハードコーディングされているわけですが｡
‫しかし､ これはユーザー入力から取得するものであったり､ ユーザーがUIから選択できるものであったり､
‫実際のUIではコンソールアプリケーションの中だけでなく､ アプリケーションがデータを取得してこれを表示することになるのです｡
‫そして､ UIの使い方や､ WPFを使った目の作り方などを後で見ていきます｡
‫つまり､ それが一つの回避策になるわけです｡
‫もう一つの方法は､ try get valueというものを使うことです｡
‫では､ さっそくコードを追加して確認してみましょう｡
‫例えば､ 空の従業員（resultと呼びます）がいるとします｡
‫internという値を持っていて､ このtry get valueメソッドを使っている場合｡
‫このメソッドはブール値を返すので､ IFFステートメントが好む条件であり､
‫結果をプリントアウトし､ その値をresultに入れます｡
‫だから､ この結果は実際に社員になるのです｡
‫だから､ バリューを得ようとする｡
‫ここで渡した値を取得するようにします｡
‫そして､ うまくいった場合､ そのボリュームはtrueを返します｡
‫この文が実行されると同時に､ この変数に結果が格納され､ outがこのresult変数に格納されることになります｡
‫そのため､ resultには社員名簿から取得した値が格納されます｡
‫この文章には､ そういうことが書いてあるわけです｡
‫そして､ 実際に動作して､ インターンが存在すれば､ このコードが実行され､ そうでなければ､ このコードが実行されます｡
‫つまり､ このキーは存在しないのです｡
‫つまり､ 同じ問題を回避するための別の方法というだけでしょう｡
‫だから､ トライゲットバリューも効果的なのです｡
‫アーネスト・インターン22歳は､ 年間15,000ユーロの給与を受け取っています｡
‫なるほど｡
‫では､ もう少し掘り下げてみましょう｡ element atメソッドを使えば､ 辞書の要素を取得することもできます｡
‫つまり､ 私たちが学んだように､ あるいはみなさんが学んだように､ 辞書はここで構造体を使うことになるのです｡
‫つまり､ 辞書はキーと値のペアの集まりであり､ キーと値のペアがここにあるような形になるように定義された構造体なのです｡
‫では､ 今年も見てみましょう｡
‫つまり､ キーと値があるわけです｡
‫これがキーとバリューのペアです｡
‫つまり､ 辞書にはそういうものが入っているわけです｡
‫では､ ここで一通り見て､ 実際にここに置いてみましょう｡
‫このforループで行うのは､ この要素追加メソッドです｡
‫ただし､ 使用するためには､ リンクの実装が必要です｡
‫リンクはコレクションを非常に効率的に扱うことができる強力なツールであることを､ 今はただ受け入れてください｡
‫後ほど､ リンクについて具体的に調べる番外編がありますが､ 今はただ受け入れることにしましょう｡
‫だから､ 後の章になれば､ もっと勉強して､ この意味がわかるようになる｡
‫だから､ 私たちの場合は
‫この例では､ キーと値のペアを作成し､ キーと値を設定します｡
‫辞書のキーの型です｡
‫また､ RT値も同様で､ これは我々の辞書の値である｡
‫さて､ 私たちの場合､ 見てみると文字列と社員です｡
‫ここで作成した辞書では､ 文字列と従業員となっていますね｡
‫しかし､ この文字列キーの背後には､ 内部的には整数値､ いわば数字も存在する｡
‫つまり､ ゼロの位置には､ 1の位置にはCEO､ 2の位置にはマネージャー､ 3の位置にはエアー担当者､
‫秘書といった具合になります｡
‫たとえ､ 全員が自分の役割の要となるポジションにいても､ 内部的には数字も出てくるのです｡
‫だから､ キーも内部的には数字になる｡
‫でまさにこの要素に使えるわけです｡
‫つまりこの要素で､ カーソルを合わせると指定したインデックスの要素が順番に返されます｡
‫つまり､ 辞書は配列なのです｡
‫つまり､ 従業員の位置がゼロ､ 従業員の位置が1､ 振幅の位置が2､ といった具合に返されます｡
‫しかし､ これはキーと値のペアを返すもので､ ここで作成するキーと値のペアは､ 文字列と従業員の型になります｡
‫これで､ キーを表示し､ キーと値のペアで従業員の値を値の位置で取得することができます｡
‫しかし､ 基本的には､ 辞書内のアイテムにアクセスする別の方法であり､
‫キーを文字列として使用するのではなく､ キーを整数として使用します｡
‫そしてこれは､ あらゆる種類のキーに共通することです｡
‫だから､ キーにどんなタイプを使っても､ 必ず番号も割り当てられている｡
‫つまり､ オブジェクト型でなくても､ double型であっても､ 常に整数が割り当てられていて､
‫この要素をat Iで使用することができるのです｡
‫それでは､ これで基本的に全社員を表示できることがおわかりいただけると思います｡
‫そのため､ リストにあるすべての従業員を調べます｡
‫だから､ ここに至るまでがそうだと思っています｡
‫そのため､ そこにいるすべての従業員が表示されるのです｡
‫しかも､ もう少し上の方まで始まっています｡
‫つまり､ これは基本的にこのforループから取得されるリストです｡
‫そこで､ forループを使って､ 辞書のリスト全体を取得することができます｡
‫もちろん､ 各ループにAを使うこともできますが､ 要素8のAIを使ってアイテムにアクセスし､
‫それをMPオブジェクトに格納することもできます｡ なぜなら､ 値は実際にはオフタイプの従業員になるからです｡ これは､ ここで定義したものだからです｡
‫さて､ キーに注目すると､ もう一度実行してみましょう｡
‫ここで､ キ・ソ・キ・マネージャーを見ることができます｡
‫キh｡ r.
‫キの秘書｡
‫さて､ その気になれば目のプリントも可能です｡
‫だから､ ここに｡
‫そうです､ トレントさん｡
‫まあ､ 実際､ ここにプリントしてみましょう｡
‫いますし､ そうやって2回目のエントリーをすることになります｡
‫そして､ Iをプリントする｡
‫なるほど｡
‫そうすれば､ 特定の位置にどの整数値が割り当てられているかを直接確認することができます｡
‫つまり､ CEOはポジションゼロなんです｡
‫マネージャーはポジション1､ 人事担当者はポジション2というように｡
‫なるほど｡
‫わかりました｡
‫というわけで､ 今回の動画はここまでです｡
‫少なくとも現時点では､ 辞書をひくには十分な長さの動画だと思います｡
‫次のビデオでは､ 既存の辞書を更新する方法､ つまり辞書の値を更新する方法､
‫そして辞書からデータを削除する方法について説明します｡
‫それでは､ 次のビデオでお会いしましょう｡