【C#】 Dictionary で Value (値) から Key (キー) を取得する方法

【C#】DictionaryでValue(値)からKey(キー)を取得する方法

はじめに

本記事では C# の Dictionary について、Value から Key を取得する方法について解説します。

Dictionary は、キーと値のペアを格納するための非常に便利なデータ構造です。通常はキーから値を取得することが多いですが、本記事では値からキーを取得する方法について紹介します。

Dictionary で value から key を取得する方法

まず、以下に Dictionary の一例を示します。

Dictionary<string, int> dictionary = new Dictionary<string, int>()
{
    {"Apple", 1},
    {"Banana", 2},
    {"Cherry", 3}
};

この Dictionary では、フルーツの名前がキーで、それぞれに割り当てられた番号が値となっています。では、「2」の値を持つキーをどうやって見つけるのでしょうか。以下にそのための C# コードを示します。

string key = dictionary.FirstOrDefault(kvp => kvp.Value == 2).Key;

このコードでは、LINQ のFirstOrDefaultメソッドを使用して、値が「2」である最初のキー・値ペアを見つけ、そのキーを取得しています。

このメソッドは、条件に一致する最初の要素を返すか、一致するものがない場合はデフォルト値を返します。注意点として、Dictionary は一意のキーを持つことを前提としていますが、値は一意であるとは限らないため、同じ値を持つ複数のキーが存在する可能性があります。その場合、この方法では最初に見つかったキーのみが返されます。

一言メモ

FirstOrDefault の使用には、コードの上部でusing System.Linq; の宣言が必要です。

サンプルコード

using System;
using System.Collections.Generic;
using System.Linq;

public class Program
{
    static void Main(string[] args)
    {
        Dictionary<string, int> dictionary = new Dictionary<string, int>()
        {
            {"Apple", 1},
            {"Banana", 2},
            {"Cherry", 3}
        };

        string key = GetKeyFromValue(dictionary, 2);

        Console.WriteLine(key);
        // 出力
        // Banana
    }

    static string GetKeyFromValue(Dictionary<string, int> dictionary, int value)
    {
        return dictionary.FirstOrDefault(kvp => kvp.Value == value).Key;
    }
}

Dictionary で値が一致するすべてのキーを取得する方法

上記で紹介したのは、最初に見つかったキーのみを取得する方法ですが、LINQ のWhereメソッドとSelectメソッドを使用して、値に一致するすべてのキーをリストに集めることができます。

以下にそのコードを示します。

using System;
using System.Collections.Generic;
using System.Linq;

public class Program
{
    static void Main(string[] args)
    {
        Dictionary<string, int> dictionary = new Dictionary<string, int>()
        {
            {"Apple", 1},
            {"Banana", 2},
            {"Cherry", 3},
            {"Durian", 2},
            {"Grape", 1}
        };

        List<string> keys = GetKeysFromValue(dictionary, 2);

        foreach (string key in keys)
        {
            Console.WriteLine(key);
        }
        // 出力
        // Banana
        // Durian
    }

    static List<string> GetKeysFromValue(Dictionary<string, int> dictionary, int value)
    {
        return dictionary.Where(kvp => kvp.Value == value).Select(kvp => kvp.Key).ToList();
    }
}

GetKeysFromValueメソッドは、引数として渡された値に一致するすべてのキーを持つリストを返します。

このメソッドは、まずWhereメソッドを使用して値が一致するすべてのキー・値ペアをフィルタリングし、次にSelectメソッドを使用してそれらのキーを抽出し、最後にToListメソッドを使用して結果をリストに変換します。

参考資料

Dictionary<TKey,TValue> クラス | Microsoft ドキュメント