【C#】DictionaryのKeysプロパティですべてのキーを順に処理する方法

目次

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を取得)する方が効率的です。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次