T>クラスをforeachループで扱う際の基本と注意すべき点、タプルを使ったより簡便な記述の仕方を紹介する。T>コレクション(System.Collections.Generic名前空間)は、キー(key)と値(value)のペアを保持しているコレクションであり、ハッシュテーブルや連想配列と呼ばれることもある。Eachループ(VB、以降はC#に合わせて「foreachループ」とだけ記述する)で扱う方法を解説する。string>型のコレクションとしている。特定のトピックをすぐに知りたいという方は以下のリンクを活用してほしい。2017以降が必要である。サンプルコードはコンソールアプリの一部であり、コードの冒頭に以下の宣言が必要となる。System.Console本稿のサンプルコードに必要な宣言(上:C#、下:VB)Dictionaryの基本的な使い方Addメソッドかインデクサを使ってデータを追加し、TryGetValueメソッドか(ContainsKeyメソッドを使うなどしてキーの存在が確実に分かっているならば)インデクサを使ってデータを取得するのが基本的な使い方だ。TIPSをご覧いただきたい。T>構造体(System.Collections.Generic名前空間)をループ変数にするとよい(次のコード)。キーと値をまとめて受け取れる。T>構造体を使うと効率がよい。dic」(VB)のように書くことが多い。T>型であるとコンパイラが推論してくれる。次のコードのような書き方を見かけることもあるが、これはループごとにキーを使った検索が発生するので速度的に不利である。←ハッシュテーブルの検索を行っているWriteLine($"{id}:{name}")Next無駄な検索が発生するのでよくないforeachループの例(上:C#、下:VB)変数dicの生成と初期データの投入コードは、前のコードと同じである。ループ内で更新や削除をする場合は、上のようなループの書き方では例外が発生してしまう(どちらの書き方でも)。更新/削除には、あらかじめ作っておいたキーのコレクションを使ってforeachループを回す(次のコード)。3:002[3]foreachループ内で更新/削除する例(上:C#、下:VB)変数dicの生成と初期データの投入コードは、冒頭のコードと同じである。キーを取り出して別のコレクションに固定してしまえば、foreachループの中でデータを変更してもそのコレクションには影響が及ばないので、このようにうまく更新/削除ができる。別のコレクションとしては、List<T>コレクションか配列を使う(IEnumerable<T>コレクションでは元のKeysコレクションと連動したままなので、やはり例外が発生してしまう)。T>構造体を使ったループで対象となるデータのキーだけを別のコレクションに取り出しておいて、後からそのコレクションを使ったループを回して実際の更新/削除を行うという方法もある。T>構造体で受け取り、そこからいちいちキーと値を取り出すのは面倒だ。タプルで受け取れるとしたら、キーと値を取り出す手間もないし、foreachステートメントの中でキーと値を受け取る変数も明示できる。2.0ではそのような改良が施されている(次のコード)。7)で導入されたものである。VBでは、このような書き方はまだサポートされていない。TIPS「複数のオブジェクトを一時的に1つにまとめるには?[4以降、C#、VB]」をご覧いただきたい。クロスプラットフォームの開発」ワークロードをインストールしておく。2017でターゲットの最小ビルドを16299(またはそれ以降)にしてUWPアプリのプロジェクトを作るだけで、このタプルを使った構文が使える。2.0のようにタプルで受け取ることはできない。T>構造体には、キー/値をタプルの分解した要素として返すDeconstructメソッドが実装されている。それで、前述のようにforeachステートメント内でタプルとして受け取れるのだ。Frameworkにはそのような実装がないのであるが、拡張メソッドを使って実装を追加してしまえばよい(次のコード)。7)で導入されたものである。VBでは、このような書き方はまだサポートされていない。まとめDictionaryのキー/値をforeachループ内で使うには、ループ変数をKeyValuePairにするのが基本となる。2.0以降では標準で実装されている)。メールマガジンをご購読ください。申し込みページへITmediaはアイティメディア株式会社の登録商標です。