web-dev-qa-db-fra.com

obtenir la clé du dictionnaire par valeur

Comment obtenir une clé de dictionnaire par valeur en C #?

Dictionary<string, string> types = new Dictionary<string, string>()
{
            {"1", "one"},
            {"2", "two"},
            {"3", "three"}
};

Je veux quelque chose comme ça:

getByValueKey(string value);

getByValueKey("one") doit être retourné "1".

Quelle est la meilleure façon de faire cela? Peut-être que HashTable, SortedLists?

325
loviji

Les valeurs ne doivent pas nécessairement être uniques, vous devez donc effectuer une recherche. Vous pouvez faire quelque chose comme ça:

var myKey = types.FirstOrDefault(x => x.Value == "one").Key;

Si les valeurs sont uniques et insérées moins souvent que lues, créez un dictionnaire inverse où les valeurs sont clés et les clés sont des valeurs.

584
Kimi

Tu pourrais faire ça:

  1. En parcourant tous les KeyValuePair<TKey, TValue> du dictionnaire (ce qui aura un impact considérable sur les performances si vous avez plusieurs entrées dans le dictionnaire)
  2. Utilisez deux dictionnaires, l'un pour le mappage valeur par clé et l'autre pour le mappage clé par valeur (qui occuperait deux fois plus d'espace mémoire).

Utilisez la méthode 1 si les performances ne sont pas une considération, utilisez la méthode 2 si la mémoire n'est pas une considération.

De plus, toutes les clés doivent être uniques, mais les valeurs ne sont pas obligatoirement uniques. Vous pouvez avoir plusieurs clés avec la valeur spécifiée.

Y a-t-il une raison pour laquelle vous ne pouvez pas inverser la relation clé-valeur?

25
Zach Johnson

J'étais dans une situation où la liaison Linq n'était pas disponible et devait élargir lambda explicitement. Il en résulta une fonction simple:

        public static T KeyByValue<T, W>(this Dictionary<T, W> dict, T val)
    {
        T key = default;
        foreach (KeyValuePair<T, W> pair in dict)
        {
            if (EqualityComparer<W>.Default.Equals(pair.Value, val))
            {
                key = pair.Key;
                break;
            }
        }
        return key;
    }

Appelez comme suit:

public static void Main()
{
    Dictionary<string, string> dict = new Dictionary<string, string>()
    {
        {"1", "one"},
        {"2", "two"},
        {"3", "three"}
    };

    string key = KeyByValue(dict, "two");       
    Console.WriteLine("Key: " + key);
}

Fonctionne sur .NET 2.0 et dans d'autres environnements limités.

2
Boris Zinchenko