‫このレッスンでは､ ハッシュテーブルを取り上げ､ 後でディクショナリも見ていきます｡
‫つまり､ ハッシュテーブルと辞書は､ Cシャープで最も便利なコレクションの一つなのです｡
‫そこで､ どのように定義し､ どのように使うのか､ どのような場合に活用すべきなのかを見ていくことにする｡
‫ハッシュとテーブルの概念を理解する｡
‫まず､ 本物の辞書について考えてみましょう｡
‫そこで､ ドイツ語と英語の辞書があり､ ドイツ語のすべての単語が英語の1つの単語だけに対応していると仮定すると､
‫ここで制限がかかってしまうからです｡
‫そこで､ autoという単語を翻訳しようとするとき､ ドイツ語では基本的に英語でcarと訳しますが､
‫例えば､ 検索できるキーワードとして1つの単語を使い､ 結果として1つの翻訳を得ることができました｡
‫つまり､ 常に1対1の関係なのです｡
‫そこで､ autoをcarに変換するのですが､ これもハッシュテーブルを使って正確に実現することができます｡
‫そして､ ここではこれを非常に具体的な例で説明します｡
‫そこで､ 例えば学生登録システムがあり､ すべての学生がIDを持ち､ 名前､ 年齢､ 成績､
‫顔写真など多くのデータを持っているとします｡
‫このようなシステムを実現するためには､ 学生一人ひとりの特別なIDが必要になります｡
‫だから､ ユニークでなければならないのです｡
‫このデータをハッシュテーブルや辞書を使って保存するとしたら､ 学生IDがキーで､
‫学生データは他のすべての学生情報を含むオブジェクトで､ それが値になります｡
‫つまり､ 常にこのキーとバリューのペアを持っているのです｡
‫いわば､ これが実際のデータであり､ その背後にある価値なのですね｡
‫だから､ ロッカーのように見ることができるのです｡
‫これがロッカーのID､ あるいはロッカーの場所ですね｡
‫それは､ さまざまな種類のデータかもしれません｡
‫IDである必要はなく､ これが値となる｡
‫つまり､ 辞書は､ ハッシュテーブルで同じ型でなければならないのです｡
‫さまざまなタイプがあります｡
‫つまり､ これは整数であったり､ これはオブジェクトであったりするわけです｡
‫そこで､ まずハッシュテーブルについて見ていくことにする｡
‫そこで､ 新しいクラスを作成することにします｡
‫ここに書いておこう｡
‫そして､ いくつかの特性を備えています｡
‫IDプロパティ､ nameプロパティ､ GPAを持つ｡
‫そして､ 非常にシンプルなコンストラクタで､ 単純に値を代入しています｡
‫つまり､ studentオブジェクトを作成するときに渡したIDが､ studentオブジェクトのIDになるといった具合です｡
‫だから､ ここではあまり派手なことはしない｡
‫クラスの章で取り上げたように､ 普通のクラスを使っているだけです｡
‫もちろん､ このクラスを別のファイルに作成することもできますので､ 先に進んでソリューションエクスプローラーを開いてください｡
‫ここで新規ファイルを作成してください｡
‫そこで､ このように新しい項目または新しいクラスを追加して､ それをstudentと呼ぶことにします｡
‫しかし､ この例では､ シンプルに1つのファイルにまとめようと思います｡
‫ご存知のように､ ファイルやクラスが混在しないように､ 別のファイルに入れるのがベストプラクティスです｡
‫さて､ student クラスができたので､ 先にハッシュテーブルを作成しましょう｡
‫そこで､ このプログラムの中のmainメソッドで､ 新しいハッシュテーブルを定義して､
‫このようなハッシュテーブルを作ります｡
‫そして､ この1つのテーブルを新しいハッシュ・テーブルと呼ぶことにする｡
‫ハッシュテーブルのクラスはsystem collectionsの中にあるので､ system collectionsを使ってこの名前空間をここに追加する必要があります｡
‫この名前空間をプロジェクトに追加せずにハッシュテーブルを入力する場合､
‫IDを混乱させる可能性があります｡
‫しかし､ 今はプログラムクラスの中にあるので､ それを利用することができます｡
‫この新しいハッシュテーブルはデータのテーブルとなり､ そこに好きなデータを入れることができるようになるわけです｡
‫このように､ ハッシュテーブルを作成し､ 空のハッシュテーブル・オブジェクトで初期化する方法を説明します｡
‫ここでできることは､ このハッシュテーブルに値を代入することです｡ コードをもう少し読みやすくするために､ student's
‫tableと呼ぶこともできます｡
‫ですから､ あとはテーブルに入れたい生徒をたくさん作るだけです｡
‫では､ それらもここに追加させてください｡
‫スタッド1スタット､ 2～3､ ステップ4と呼ぶことにして､ すべて新しいスチューデントオブジェクトにする予定です｡
‫つまり､ これはIDを持つ学生で､ 1つはマリアになります｡
‫彼女のGPAは98点だ｡
‫そして､ IDが1になるJSONを用意します｡
‫これがこのIDで､ いわば固有の識別子で､ あとは学生が持っているGPAです｡
‫なるほど｡
‫これで､ すべての学生が揃いましたので､ 学生IDを使用して学生テーブルに割り当てることができます｡
‫そして､ 良い方法は､ 先に進み､ studentテーブルをドットで追加し､ ここではstudent 1
‫IDを使用することで､ このプロパティがキーとなります｡
‫このように､ ハッシュテーブルではオブジェクト型のキーを持つことができるので､ キーには任意の型のオブジェクトを指定でき､
‫値には任意のオブジェクトを指定できます｡
‫だから､ 値を割り当てることもできるし､ NULLにすることもできる｡
‫さて､ しかし､ 我々は値を割り当てるつもりで､ それはこのように学生のもの自体になります｡
‫他の生徒についても同様に､ それぞれの生徒のIDを使用することにします｡
‫そこで､ ここではすべて生徒の表を使うことにしましょう｡
‫なるほど｡
‫さて､ これでハッシュテーブルができたわけですが､ どうやってエントリーを取り出すのでしょうか？
‫では､ ハッシュテーブルからエントリーを取り出すにはどうしたらよいのでしょうか｡
‫では､ そのための方法をいろいろと見ていきましょう｡
‫まず最初に､ ここで学生オブジェクトを作成します｡
‫つまり､ studentとこのオブジェクトはstored studentと呼ばれることになります｡
‫そこで､ 私のテーブルから生徒の値を取得することにします｡
‫つまり､ この場合は生徒のテーブルですね｡
‫生徒たちはこのようにテーブルを囲みます｡
‫そして､ ここは配列でアクセスする方法と似ています｡
‫Xが配列の中の値であれば､ IDでアクセスすることができますね｡
‫例えば､ ID1のものをこんな風に取得したいとします｡
‫ここで問題なのは､ このハッシュテーブルが､ 先ほど見たように､ オブジェクト型の値を持つことができるということです｡
‫ここで､ addメソッドを呼び出すと､ キーを代入することができますが､ その値はobject型になります｡
‫そして､ ここがobject型になることを意味する｡
‫しかし､ 生徒にはオブジェクトタイプだけを割り当てることはできません｡
‫このstored student 1は実際にはstudent型であるため､ student型から外れている必要があります｡
‫だから､ ここで学生にキャストして､ これが機能するようにする必要があります｡
‫さて､ このオブジェクトを生徒にキャストするのは､ 生徒のテーブルの中の位置が1であることが分かっているからです｡
‫したがって､ ID1では､ 値は実際にはstudent型である｡
‫つまり､ ここではID1の学生を取得でき､ ID2の学生を取得することもできる､ というわけです｡
‫しかし､ それは､ 実際にこの数字を使っていることが分かっているからこそできることなのです｡
‫だから､ 手に入れたい人は､ そうでない人は､ IDでサードを使えばいいんです｡
‫これで､ 生徒1人のIDの後ろにある値がわかるわけです｡
‫ですから､ これは基本的にこの値をここに､ あるいはこの学生をここに出すということになります｡
‫そして､ 正確にはこれです｡
‫だから､ ここのこれ､ このIDのやつで保存しているものだから｡
‫このように､ hello worldと書く代わりに､ 学生ID､ 学生の名前､
‫GPAなど､ 実際に役に立つことを書くことができます｡
‫そこで､ ストアドスチューデントワンドットIDを使用することにします｡
‫そこで､ 彼のID､ 名前､ GPAを入手したのです｡
‫そしてこの場合､ ID1の位置でマリアですから､ 彼女のGPAなどです｡
‫さて､ これを実行すると､ 学生IDは1名､ 名前はMaria､ GPAは98と表示されます｡
‫ここでは､ ハッシュテーブルを作成する方法を見ました｡
‫このようにして､ ハッシュテーブルにデータを格納することができるのです｡
‫実はここで､ ハッシュテーブルにデータを格納しているのです｡
‫そして､ このようにハッシュテーブルからデータを取り出すことができるのです｡
‫では､ 実際にハッシュテーブルの中のすべてのデータを表示したいが､ 特定のキーを自由に使えないと仮定してみましょう｡
‫これを解決するには､ ハッシュテーブルからすべてのキーを取得すればよいのです｡
‫まず､ 辞書項目と呼ばれる構造体についてです｡
‫ハッシュテーブルに新しいエントリーを追加するたびに
‫つまり､ ハッシュテーブルは基本的にディクショナリーエントリーのコレクションであるということです｡
‫そこで､ 辞書エントリーの一時オブジェクトを使い､ for eachループを使ってハッシュテーブルを調べていきます｡
‫では､ この例でfor eachループを使ってみましょう｡
‫そして､ このループの種類ごとのものが､ 辞書の項目となる｡
‫それが､ 今回の構造です｡
‫構造辞書の項目はこちらです｡
‫では､ そのアイテム名にはどのようなものがあるのでしょうか？
‫エントリーを利用する
‫もちろん､ エントリーがstudent型になることが分かっているので､ これをstudentなどと呼ぶこともできますが､
‫分からないのでentryと呼ぶこともできるとします｡
‫そして､ これを実行したり､ 値を取得したりするコレクションは何でしょうか｡ それが学生テーブルになります｡
‫だから､ これは回収するんです｡
‫IDが分かっている個体｡
‫そして､ ここにも｡
‫ハッシュテーブルからすべての値を取得する｡
‫なるほど｡
‫つまり､ ハッシュテーブルの中のエントリーは､ 先ほど言ったように､ 辞書のエントリーの型になるわけです｡
‫これによって､ 今､ 私たちはこのことを理解することができるのです｡
‫表､ 学生表と基本的に値を表示します｡
‫つまり､ entry valueはオブジェクトを返すので､ ここにobjectと書いてあるのがわかると思います｡
‫しかし､ 学生の詳細を取得するために必要なものは､ 学生オブジェクトになります｡
‫これから必要なのは､ 次のようなことです｡
‫そこで､ 一時的な値を作成し､ これがエントリ値となる｡
‫ここで､ 先ほどと同じ問題が発生します｡ これは単なるオブジェクトなので､ これをstudentにキャストする必要がありますね｡
‫しかし､ 学生のプロパティにアクセスできるように､ 学生型にする必要があります｡
‫つまり､ それ以外のエントリーの値であるドットにはIDがないので､ そこに存在するにもかかわらず､ そのIDや名前などにアクセスすることができないのです｡
‫しかし､ IDはそれを許しません｡ なぜなら､ まず値を正しい型に変換するか､ キャストする必要があるからです｡
‫このように､ キャストして一時的に保存しておけば､ 個々の値をコンソールなどに書き出すことができますし､
‫プログラムをどのように使っても構いません｡
‫tempはstudent型でstudentはGPAというIDを持っているので､
‫テンプレートIDを使ってstudent IDを使用することができます｡
‫では､ 実際にやってみましょう｡
‫このコードを実行して､ このfor eachループが何をするのかを見てみましょう｡
‫と書かれています｡
‫STUDENT4 スティーブ
‫STUDENT three スクレーラ｡
‫STUDENT2がジェイソン､ 1がマリアです｡
‫つまり､ 最後の項目から始まり､ 最初の項目へと上がっていくのです｡
‫さて､ それはこの時点で､ すでに学生に変換しているにもかかわらず､ 学生かどうかわからない場合です｡
‫これは､ ハッシュテーブルが実際には単なる辞書のエントリーの集まりであることを示すためのものです｡
‫そこで､ これをループごとに簡略化する方法を考えてみます｡
‫実際に変数の型が学生になる各々について言うことで､ これを単純化することができます｡
‫項目名は､ まあ､ 学生といってもいい｡
‫みたいな価値観というか｡
‫だから､ それでいいんです｡
‫そして､ 私が通過したいコレクションは､ 学生のテーブルがドット値であるのに対し､ テーブルとなります｡
‫つまり､ このハッシュテーブルの値のAIコレクションがあるわけです｡
‫そこで､ ハッシュテーブルの値を含むAIコレクションを取得する｡
‫そのため､ これによって､ 値を直接見ていく必要がなくなります｡
‫基本的には､ ここでやったように､ 変換したり､ studentオブジェクトにキャストしたりします｡
‫だから今は､ 先に進むだけでいいんです｡
‫ここでやったのと同じことをやってください｡
‫しかし､ 今は､ もちろん､ entryでもtempでもないので､ value IDなどになりますが､ 各グループのこれがそうなので､
‫実際にはvalueになりますね｡
‫その繰り返しで､ 私たちが持っているすべての値を調べているのです｡
‫そして､ valueは､ その特定のイテレーションで現在見ている個々の値になります｡
‫だから､ 最初のイテレーションでは､ そうなる｡
‫スティーブ
‫その後､ クララ､ ジェイソン､ マリアの順になります｡
‫この行を削除して､ あるいはfor eachループにして､ もう一度実行すれば､ 同じ結果が得られることがわかります｡
‫だから､ スティーブ､ クララ､ ジェイソン､ マリア｡
‫なるほど｡
‫次のビデオでは､ ハッシュテーブルをより深く理解するために､
‫基本的にコードを少し拡張することに挑戦してもらいます｡
‫そして､ ディクショナリー（辞書）を見ていきます｡