Dictionaryとキー(Key)
Dictionary<TKey, TValue>は、C#においてキー(Key)と値(Value)をペアで管理するコレクションです。foreachループでDictionary自体を処理すると、KeyValuePair<TKey, TValue>(キーと値の両方を含むオブジェクト)が返されます。
// foreach (var pair in myDictionary)
// {
// Console.WriteLine($"{pair.Key} = {pair.Value}");
// }
しかし、時には「値は不要で、辞書に含まれるすべてのキーだけを一覧で取得したい」または「キーのリストだけを別のメソッドに渡したい」という場合があります。
このような要求に応えるのが、Dictionaryが提供するKeysプロパティです。
Dictionary<TKey, TValue>.Keys プロパティ
Keysプロパティは、Dictionaryインスタンスの読み取り専用プロパティで、そのDictionaryに含まれるすべてのキーを含むコレクション(KeyCollection)を返します。
このKeyCollectionは、foreachループで直接反復処理(イテレーション)することができます。
Keysプロパティの使用例
string型のキー(ユーザーID)とint型の値(スコア)を持つDictionaryを例に、Keysプロパティの使い方を示します。
コード例:Keysプロパティによる反復処理
foreach (var key in userScores.Keys) のように記述することで、キーだけを順番に取り出すことができます。
using System;
using System.Collections.Generic;
public class DictionaryKeysExample
{
public static void Main()
{
// ユーザーID (string) と スコア (int) の Dictionary
var userScores = new Dictionary<string, int>
{
["usr_001"] = 1500,
["usr_002"] = 980,
["usr_003"] = 1200,
["usr_004"] = 2100
};
Console.WriteLine("--- 登録されている全ユーザーID (キー) ---");
// .Keys プロパティでキーのコレクションを取得し、ループ処理
foreach (var userId in userScores.Keys)
{
// userId 変数には "usr_001", "usr_002"... が順番に格納される
Console.WriteLine($"ID: {userId}");
}
Console.WriteLine("\n--- キーを使って値にアクセス ---");
// Keys プロパティで取得したキーを使い、
// インデクサ [key] で元の Dictionary の値にアクセスする
foreach (var userId in userScores.Keys)
{
int score = userScores[userId]; // キーを使った値のルックアップ
Console.WriteLine($"ID: {userId}, Score: {score}");
}
}
}
出力結果(Dictionaryの順序は保証されません):
--- 登録されている全ユーザーID (キー) ---
ID: usr_001
ID: usr_002
ID: usr_003
ID: usr_004
--- キーを使って値にアクセス ---
ID: usr_001, Score: 1500
ID: usr_002, Score: 980
ID: usr_003, Score: 1200
ID: usr_004, Score: 2100
foreach (var key in dict.Keys) vs foreach (var pair in dict)
Keysプロパティを使ったループ処理は、キーだけが必要な場合には簡潔です。
しかし、上記のコード例の後半のように「結局、キーと値の両方が必要になる」場合は、foreach (var pair in userScores) を使用する方が効率的です。
// 比較:キーと値の両方が必要な場合の、より効率的な方法
foreach (var pair in userScores)
{
// pair.Key と pair.Value を直接使用
// userScores[key] という再度のルックアップ(検索)が発生しない
Console.WriteLine($"ID: {pair.Key}, Score: {pair.Value}");
}
foreach (var key in userScores.Keys) ループ内で userScores[key] を呼び出すと、キーの反復処理に加えて、キーに基づいた値の検索がループのたびに発生します。foreach (var pair in userScores) は、キーと値のペアを一度に取得するため、このような二重の処理が発生しません。
まとめ
Dictionary<TKey, TValue>.Keysプロパティは、Dictionaryに格納されているすべてのキーを読み取り専用のコレクションとして取得するための機能です。
foreachループでこのKeysコレクションを処理することで、キーの一覧を取得できます。ただし、キーと値の両方が必要な場合は、Dictionary自体をforeachで処理(KeyValuePairを取得)する方が効率的です。
